Hibernate查詢之Criteria查詢

轉自:http://www.cnblogs.com/Laupaul/archive/2012/02/15/2353194.html

Criteria是一種比hql更面向對象的查詢方式。Criteria 可使用 Criterion 和 Projection 設置查詢條件。可以設置 FetchMode( 聯合查詢抓取的模式 ) ,設置排序方式,Criteria 還可以設置 FlushModel (沖刷 Session 的方式)和 LockMode (數據庫鎖模式)。?
  Criterion 是 Criteria 的查詢條件。Criteria 提供了 add(Criterion criterion) 方法來添加查詢條件。?
  Criterion 接口的主要實現包括: Example 、 Junction 和 SimpleExpression 。而Junction 的實際使用是它的兩個子類 conjunction 和 disjunction ,分別是使用 AND 和 OR 操作符進行來聯結查詢條件集合。?
  Criterion 的實例可以通過 Restrictions 工具類來創建,Restrictions 提供了大量的靜態方法,如 eq (等于)、 ge (大于等于)、 between 等來方法的創建 Criterion 查詢條件(SimpleExpression 實例)。除此之外, Restrictions 還提供了方法來創建 conjunction 和disjunction 實例,通過往該實例的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合。?
  Example 的創建有所不同, Example 本身提供了一個靜態方法 create(Objectentity) ,即根據一個對象(實際使用中一般是映射到數據庫的對象)來創建。然后可以設置一些過濾條件:?
  Example exampleUser =Example.create(u)?
  .ignoreCase() // 忽略大小寫?
  .enableLike(MatchMode.ANYWHERE); // 對 String 類型的屬性,無論在那里值在那里都匹配。相當于 %value%?
  Project 主要是讓 Criteria 能夠進行報表查詢,并可以實現分組。 Project 主要有SimpleProjection 、ProjectionList 和 Property 三個實現。其中SimpleProjection 和ProjectionList 的實例化是由內建的Projections 來完成,如提供的 avg 、count 、max 、min 、sum 可以讓開發者很容易對某個字段進行統計查詢。?
  Property 是對某個字段進行查詢條件的設置,如通過Porperty.forName(“color”). in(new String[]{“black”,”red”,”write”}); 則可以創建一個 Project 實例。通過criteria 的 add(Project) 方法加入到查詢條件中去。

1. 創建一個Criteria 實例
  org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。?
  Criteria crit = sess.createCriteria(Cat.class);?
  crit.setMaxResults(50);?
  List cats = crit.list();
2. 限制結果集內容
  一個單獨的查詢條件是org.hibernate.criterion.Criterion 接口的一個實例。?
  org.hibernate.criterion.Restrictions類 定義了獲得某些內置Criterion類型的工廠方法。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.like("name", "Fritz%") )?
  .add( Restrictions.between("weight", minWeight, maxWeight) )?
  .list();?
  約束可以按邏輯分組。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.like("name", "Fritz%") )?
  .add( Restrictions.or(?
  Restrictions.eq( "age", new Integer(0) ),?
  Restrictions.isNull("age")?
  ) )?
  .list();?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions. in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )?
  .add( Restrictions.disjunction()?
  .add( Restrictions.isNull("age") )?
  .add( Restrictions.eq("age", new Integer(0) ) )?
  .add( Restrictions.eq("age", new Integer(1) ) )?
  .add( Restrictions.eq("age", new Integer(2) ) )?
  ) )?
  .list();?
  Hibernate提供了相當多的內置criterion類型(Restrictions 子類), 但是尤其有用的是可以允許你直接使用SQL。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",?
  Hibernate.STRING) )?
  .list();?
  {alias}占位符應當被替換為被查詢實體的列別名。?
  Property實例是獲得一個條件的另外一種途徑。你可以通過調用Property.forName() 創建一個?
  Property。?
  Property age = Property.forName("age");?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.disjunction()?
  .add( age.isNull() )?
  .add( age.eq( new Integer(0) ) )?
  .add( age.eq( new Integer(1) ) )?
  .add( age.eq( new Integer(2) ) )?
  ) )?
  .add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )?
  .list();
3. 結果集排序
  可以使用org.hibernate.criterion.Order來為查詢結果排序。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.like("name", "F%")?
  .addOrder( Order.asc("name") )?
  .addOrder( Order.desc("age") )?
  .setMaxResults(50)?
  .list();?
  List cats = sess.createCriteria(Cat.class)?
  .add( Property.forName("name").like("F%") )?
  .addOrder( Property.forName("name").asc() )?
  .addOrder( Property.forName("age").desc() )?
  .setMaxResults(50)?
  .list();
4. 關聯
  你可以使用createCriteria()非常容易的在互相關聯的實體間建立 約束。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.like("name", "F%")?
  .createCriteria("kittens")?
  .add( Restrictions.like("name", "F%")?
  .list();?
  注意第二個 createCriteria()返回一個新的 Criteria實例,該實例引用kittens 集合中的元素。?
  接下來,替換形態在某些情況下也是很有用的。?
  List cats = sess.createCriteria(Cat.class)?
  .createAlias("kittens", "kt")?
  .createAlias("mate", "mt")?
  .add( Restrictions.eqProperty("kt. name", "mt. name") )?
  .list();?
  (createAlias()并不創建一個新的 Criteria實例。)?
  Cat實例所保存的之前兩次查詢所返回的kittens集合是 沒有被條件預過濾的。如果你希望只獲得?
  符合條件的kittens, 你必須使用returnMaps()。?
  List cats = sess.createCriteria(Cat.class)?
  .createCriteria("kittens", "kt")?
  .add( Restrictions.eq("name", "F%") )?
  .returnMaps()?
  .list();?
  Iterator iter = cats.iterator();?
  while ( iter.hasNext() ) {?
  Map map = (Map) iter.next();?
  Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);?
  Cat kitten = (Cat) map.get("kt");?
  }
5. 動態關聯抓取
  你可以使用setFetchMode()在運行時定義動態關聯抓取的語義。?
  List cats = sess.createCriteria(Cat.class)?
  .add( Restrictions.like("name", "Fritz%") )?
  .setFetchMode("mate", FetchMode.EAGER)?
  .setFetchMode("kittens", FetchMode.EAGER)?
  .list();?
  這個查詢可以通過外連接抓取mate和kittens。
6. 查詢示例
  org.hibernate.criterion.Example類允許你通過一個給定實例 構建一個條件查詢。?
  Cat cat = new Cat();?
  cat.setSex('F');?
  cat.setColor(Color.BLACK);?
  List results = session.createCriteria(Cat.class)?
  .add( Example.create(cat) )?
  .list();?
  版本屬性、標識符和關聯被忽略。默認情況下值為null的屬性將被排除。?
  可以自行調整Example使之更實用。?
  Example example = Example.create(cat)?
  .excludeZeroes() //exclude zero valued properties?
  .excludeProperty("color") //exclude the property named "color"?
  .ignoreCase() //perform case insensitive string comparisons?
  .enableLike(); //use like for string comparisons?
  List results = session.createCriteria(Cat.class)?
  .add(example)?
  .list();?
  甚至可以使用examples在關聯對象上放置條件。?
  List results = session.createCriteria(Cat.class)?
  .add( Example.create(cat) )?
  .createCriteria("mate")?
  .add( Example.create( cat.getMate() ) )?
  .list();
7. 投影、聚合和分組
  org.hibernate.criterion.Projections是 Projection 的實例工廠。通過調用 setProjection()應用投影到一個查詢。?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.rowCount() )?
  .add( Restrictions.eq("color", Color.BLACK) )?
  .list();?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.projectionList()?
  .add( Projections.rowCount() )?
  .add( Projections.avg("weight") )?
  .add( Projections.max("weight") )?
  .add( Projections.groupProperty("color") )?
  )?
  .list();?
  ???
  在一個條件查詢中沒有必要顯式的使用 "group by" 。某些投影類型就是被定義為 分組投影,他們也出現在SQL的group by子句中。可以選擇把一個別名指派給一個投影,這樣可以使投影值被約束或排序所引用。?
  實現方式:?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )?
  .addOrder( Order.asc("colr") )?
  .list();??
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.groupProperty("color").as("colr") )?
  .addOrder( Order.asc("colr") )?
  .list();?
  alias()和as()方法簡便的將一個投影實例包裝到另外一個 別名的Projection實例中。簡而言之,當添加一個投影到一個投影列表中時 你可以為它指定一個別名:?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.projectionList()?
  .add( Projections.rowCount(), "catCountByColor" )?
  .add( Projections.avg("weight"), "avgWeight" )?
  .add( Projections.max("weight"), "maxWeight" )?
  .add( Projections.groupProperty("color"), "color" )?
  )?
  .addOrder( Order.desc("catCountByColor") )?
  .addOrder( Order.desc("avgWeight") )?
  .list();?
  List results = session.createCriteria(Domestic.class, "cat")?
  .createAlias("kittens", "kit")?
  .setProjection( Projections.projectionList()?
  .add( Projections.property("cat. name"), "catName" )?
  .add( Projections.property("kit. name"), "kitName" )?
  )?
  .addOrder( Order.asc("catName") )?
  .addOrder( Order.asc("kitName") )?
  .list();?
  也可以使用Property.forName()來表示投影:?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Property.forName("name") )?
  .add( Property.forName("color").eq(Color.BLACK) )?
  .list();?
  List results = session.createCriteria(Cat.class)?
  .setProjection( Projections.projectionList()?
  .add( Projections.rowCount().as("catCountByColor") )?
  .add( Property.forName("weight").avg().as("avgWeight") )?
  .add( Property.forName("weight").max().as("maxWeight") )?
  .add( Property.forName("color").group().as("color" )?
  )?
  .addOrder( Order.desc("catCountByColor") )?
  .addOrder( Order.desc("avgWeight") )?
  .list();
8. 離線(detached)查詢和子查詢
  DetachedCriteria類使你在一個session范圍之外創建一個查詢,并且可以使用任意的 Session來執行它。?
  DetachedCriteria query = DetachedCriteria.forClass(Cat.class)?
  .add( Property.forName("sex").eq('F') );?
  //創建一個Session?
  Session session = .;?
  Transaction txn = session.beginTransaction();?
  List results = query.getExecutableCriteria(session).setMaxResults(100).list();?
  txn.commit();?
  session.close();?
  DetachedCriteria也可以用以表示子查詢。條件實例包含子查詢可以通過 Subqueries或者?
  Property獲得。?
  DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)?
  .setProjection( Property.forName("weight").avg() );?
  session.createCriteria(Cat.class)?
  .add( Property.forName("weight).gt(avgWeight) )?
  .list();?
  DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)?
  .setProjection( Property.forName("weight") );?
  session.createCriteria(Cat.class)?
  .add( Subqueries.geAll("weight", weights) )?
  .list();?
  相互關聯的子查詢也是有可能的:?
  DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")?
  .setProjection( Property.forName("weight").avg() )?
  .add( Property.forName("cat2.sex").eqProperty("cat.sex") );?
  session.createCriteria(Cat.class, "cat")?
  .add( Property.forName("weight).gt(avgWeightForSex) )?
  .list();?

轉載于:https://www.cnblogs.com/marcotan/p/4256931.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/273609.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/273609.shtml
英文地址,請注明出處:http://en.pswp.cn/news/273609.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

IntelliJ Idea 常用插件

必備插件 Lombok 使用此插件可以使得我們的代碼簡潔,不用去寫很多的set/get方法。使用之前需要引入 lombok 插件依賴。 JsonFormat 基于GsonFormat。快速將JSON字符串轉換為實體類。它支持Jackson注釋。 MyBatis Log Plugin 將 SQL 直接打印在控制臺,不用…

jQuery 學習筆記(jQuery: The Return Flight)

第一課. ajax:$.ajax(url[, settings]) 練習代碼: $(document).ready(function() {$("#tour").on("click", "button", function() {$.ajax(/photos.html, {success: function(response) {$(.photos).html(response).fadeI…

Redis Hash 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

Redis set 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

緩存初解(五)---SpringMVC基于注解的緩存配置--web應用實例

之前為大家介紹了如何使用spring注解來進行緩存配置 (EHCache 和 OSCache)的簡單的例子,詳見 Spring基于注解的緩存配置--EHCache AND OSCache 現在介紹一下如何在基于注解springMVC的web應用中使用注解緩存,其實很簡單&#xff0…

Redis String 類型操作及常用命令

七個原則 Redis 是一個操作數據結構的語言工具,它提供基于 TCP 的協議以操作豐富的數據結構。在 Redis 中,數據結構這個詞的意義不僅表示在某種數據結構上的操作,更包括了結構本身及這些操作的時間空間復雜度。Redis 定位于一個內存數據庫&am…

于我,過去,現在和未來 —— 西格里夫·薩松

In me, past, present, future meet            于我,過去、現在和未來To hold long chiding conference              商討聚會 各執一詞 紛擾不息My lusts usurp the present tense             林林總總的 欲望,…

Java assert關鍵字

Java assert關鍵字 Assert 簡介 Java2在1.4中新增了一個關鍵字:assert。在程序開發過程中使用它創建一個斷言(assertion)。語法格式有兩種: assert condition; 這里condition是一個必須為真(true)的表達式。如果表達式的結果為true,那么斷言為…

linux 二級域名設置

首先,你的擁有一個有泛域名解析的頂級域名,例如: domain.com  其次,在 httpd.conf 中打開 mod_rewrite  之后,在 httpd.conf 的最后,添加以下內容:  RewriteEngine on  RewriteMap lowe…

Spring Boot @Conditional 注解

Spring Boot Conditional注解 Conditional是Spring4新提供的注解,它的作用是按照一定的條件進行判斷,滿足條件的才給容器注冊Bean。 Conditional注解定義 Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documente…

計算幾何 半平面交

LA 4992 && hdu 3761 Jungle Outpost 杭電的有點坑啊。。一直爆內存,后來發現大白的半平面交模板那里 point *p new point[n]; line *q new line[n]這里出了問題,應該是在函數里面申請不了比較大的數組,所以爆內存。。我在全局定義…

Maven 強制導入jar包

場景 有時候因為各種原因(依賴有了,jar包有了),項目中就是沒有這個jar包。 在需要強導的項目中創建lib文件夾,將需要強導的jar包訪問lib中。添加依賴${pom.basedir}:獲取當前所在的項目目錄 ${pom.basedir&…

0910

我累得時候希望你能在我身邊,在你的懷里好好的睡一覺。轉載于:https://www.cnblogs.com/zhanzhao/p/3964175.html

《Java 高并發》03 線程的生命周期

相關概念 進程是指一個內存中運行的應用程序,每個進程都有自己獨立的一塊內存空間,一個進程中可以啟動多個線程。 一個進程是一個獨立的運行環境,它可以被看作一個程序或者一個應用。而線程是在進程中執行的一個任務。Java運行環境是一個包含…

OpenLayers3 online build

openlayers3使用了一個比較復雜的build工具,從github上下載下來的代碼中并沒有build之后的版本,要配置build環境又比較繁瑣,好在官方的example中提供了在線的版本,下面就是link: http://openlayers.org/en/v3.0.0/buil…

Mysql 必知必會(一)

文章案例所需的SQL文件,點擊下載 使用MySQL 進入mysql安裝目錄下的bin目錄: 連接Mysql:mysql -uroot -p123456;顯示Mysql下的所有數據庫:show databases;切換數據庫:use local;顯示數據庫下所有表名:show t…

design.js

//模塊式開發 var myNamespace (function () { var myPrivateVar 0;var myPrivateMethod function (foo) {console.log(foo); };return {myPublicVar : "foo",myPublicFunction : function (bar) {myPrivateVar;myPrivateMethod(bar);} }; })(); //原型模式 var…

Spring boot 整合dynamic實現多數據源

項目git地址:Jacob-dynamic 準備工作 # 創建數據庫db1 CREATE DATABASE db1CHARACTER SET utf8 COLLATE utf8_bin # 創建user表 CREATE TABLE user (id int(11) DEFAULT NULL,name varchar(255) DEFAULT NULL ) ENGINEInnoDB DEFAULT CHARSETutf8 # 添加數據 INSERT…

LInux 命令大全

開關機 reboot:重啟shutdown -h 0 或者init 0 :關機halt:關機poweroff:關機 文件的操作 ll:顯示文件夾詳細信息ls:顯示文件目錄mkdir fileName:創建目錄mkdir -p fileName/fileName:目錄cd file…

企業級業務系統開發實戰-序言

前些年一直在做微軟的解決方案實施與軟件開發的工作。在學習、項目實施、開發與管理的過程中學到了別人不少好的東西,也自身總結了大量的經驗,希望能夠通過一個系列來跟大家分享關于軟件開發方面的內容。 這個開發系列的由來是這樣的,兩年前作…