1. 程式人生 > >Hibernate 中的 Criteria 查詢。

Hibernate 中的 Criteria 查詢。

         (1)Criterion 的例項可以通過 Restrictions 工具類來建立,

               Restrictions 提供了大量的靜態方法,如 eq (等於)、 ge (大於等於)、 between 等來方法的建立 Criterion 查詢條件(SimpleExpression 例項)。除此之外,

               Restrictions 還提供了方法來建立 conjunction 和disjunction 例項,通過往該例項的 add(Criteria) 方法來增加查詢條件形成一個查詢條件集合

           Restrictions 子類Expression 。添加了sql(sql[,object[], Type[] ]);

           Example 的建立有所不同, Example 本身提供了一個靜態方法 create(Object entity) ,即根據一個物件(實際使用中一般是對映到資料庫的物件)來建立。然後可以設定一些過濾條件:

                      Example exampleUser =Example.create(u)

                                                 .ignoreCase() // 忽略大小寫

                                                                     .enableLike(MatchMode.ANYWHERE);// 對 String 型別的屬性,無論在那裡值在那裡都匹配。相當於 %value%

     (2)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) 方法加入到查詢條件中去。

使用 Criteria 進行查詢,主要要清晰的是 Hibernate 提供了那些類和方法來滿足開發中查詢條件的建立和組裝,下面介紹幾種用法:

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. 投影(Projections)、聚合(aggregation)和分組(grouping)

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();

相關推薦

HibernateCriteria查詢常用方法

前面的對映連結資料庫就略過了 Criteria 介面與Query介面非常型別,允許建立並執行面向物件的標準化查詢.值的注意的是Criteria介面是輕量級的,不能再Session只玩使用 首先使用Criteria,必須得到Criteria Criter

Hibernate Criteria 查詢

         (1)Criterion 的例項可以通過 Restrictions 工具類來建立,                Restrictions 提供了大量的靜態方法,如 eq (等於)、 ge (大於等於)、 between 等來方法的建立 Criterion 查詢條件(SimpleExpr

分享知識-快樂自己:Hibernate Criteria Query查詢詳解

limit all des 結合 project 實現簡單 result eager sele 1):Hibernate 中Criteria Query查詢詳解 當查詢數據時,人們往往需要設置查詢條件。在SQL或HQL語句中,查詢條件常常放在where子句中。 此外,Hib

2018.11.13 Hibernate 資料庫查詢Criteria查詢例項

Criteria是面向物件的無語句查詢 Demo.java package com.legend.b_criteria; import java.util.List; import org.hibernate.Criteria; import org.hibernate.Session; import

加強hibernatecriteria查詢的使用Example查詢

        有人說Query更強大,但我人個比較喜歡用criteria,覺得使用criteria才符合Java開發的規範。 但criteria在使用example進行關聯的物件查詢時,會得到非預期的結果。 舉個例子: 兩個簡單實體類Department:(部門) 以及另

HibernateCriteria的完整用法

查看 必須 範圍 return html 約束 結果集 esc 之前 Hibernate中Criteria的完整用法 Criteria的完整用法 QBE (Query By Example) Criteria cri = session.createCriteria(Stu

Hibernate 查詢(hql,離線)和getHibernateTemplate()常用方法彙總

1.hql通過getHibernateTemplate() (1) 回撥介面getHibernateTemplate().execute(new HibernateCallback())方法 public User getEmailByUsername(final String userna

Hibernate查詢策略

 Hibernate的基本策略查詢。 建立pojo.User 類 package com.pojo; import java.util.HashSet; import java.util.Set; /** * User entity. @author MyEclip

hibernate查詢條件的分頁

所謂分頁,從資料庫中分,則是封裝一個分頁類。利用分頁物件進行分頁。 但,分頁往往帶查詢條件。 分頁類的三個重要資料:【當前頁碼數】,【資料庫中的總記錄數】,【每頁顯示的資料的條數】 原理:select * from  【表名】 where   【欄位名】  like   【'%條件%'】    limit

Hibernate離線查詢與線上查詢的區別

Criteria 和 DetachedCriteria 的主要區別在於建立的形式不一樣, Criteria 是線上的,所以它是由 Hibernate Session 進行建立的;而 DetachedCriteria 是離線的,建立時無需 Session,

MongoDBCriteria查詢

Criteria條件查詢的用法 Criteria單個條件的查詢           @Autowired            private MongoTemplate mongoTemplateVRMT;             Criteria criteria =

Hibernate各種查詢方法的總結

Hibernate中各種查詢方法的總結: 1.使用HQL語句 Query q = session.createQuery("select e from com.sun.demo.Emp e"); 2.使用Load方法(主鍵查詢) Emp e = (Emp)session.lo

Hibernatesql查詢返回不受Hibernate管理的實體

Hibernate查詢有好多種方法,當我們需要查詢自己構建的實體時,需要使用session.createSQLQuery(sql)方法查詢實體,但這樣只能返回由Hibernate管理的實體,即生成資料庫表的那些實體,為了返回任意的自定義的實體,我們需要這樣做: sess.c

Hibernatein查詢一個問題傳多個引數

</pre><pre name="code" class="java"> public List<UnitGroup> getUnitGroupByUnitId(Integer unitId,String productId) thro

Hibernate利用Criteria進行資料庫表資料的增加查詢

       Hibernate 提供了操縱物件和相應的 RDBMS 表中可用的資料的替代方法。一種方法是標準的 API,它允許你建立一個標準的可程式設計查詢物件來應用過濾規則和邏輯條件。        Hibernate Session 介面提供了 createCrite

Hibernate查詢Criteria查詢in的長度大於1000解決方案

眾所周知。hibernate的查詢有好幾種,Criteria正是其查詢方式的一種,跟其他查詢方式比較下具體優缺多有爭議,不過這個不是今天要討論的重點,我開發用的就是Criteria查詢,先來說說我在使用中遇到的問題,在查詢中對於in的使用我想都很普遍,比如: Criter

hibernate的Query查詢criteria查詢的區別

Query查詢: <span style="font-size:18px;">session = HibernateUitl.getSession(); String hql =

Hibernate三種狀態;query查詢;ResultTransformer轉換為pojo對象;能夠將query語句寫在xmlCriteria查詢;ProjectionList總和/f分組等函數

nfa factor let 統計 保存 pass 數據庫 排序 ESS 版權聲明:本文為博主原創文章,未經博主同意不得

Hibernate的條件查詢完畢類

hiberna 產生 content div ber ont size 查詢 criteria Hibernate中的條件查詢有下面三個類完畢: 1、Criteria:代表一次查詢 2、Criterion:代表一個查詢條件 3、Restrictions:產生

hibernate框架學習筆記7:HQL查詢Criteria查詢

import res ber return org close 返回 closed 所有 HQL查詢:hibernate獨有的查詢語言 適用於不復雜的多表查詢 示例: 實體類: package domain; public class Customer {