Hibernate之Criteria的完整用法

                                             Criteria的完整用法html

 

QBE (Query By Example)sql

Criteria cri = session.createCriteria(Student.class);數據庫

cri.add(Example.create(s)); //s是一個Student對象session

list cri.list();框架

實質:建立一個模版,好比我有一個表serial有一個 giftortoy字段,我設置serial.setgifttoy("2"),工具

則這個表中的全部的giftortoy爲2的數據都會出來post

2: QBC (Query By Criteria) 主要有Criteria,Criterion,Oder,Restrictions類組成fetch

session = this.getSession();ui

Criteria cri = session.createCriteria(JdItemSerialnumber.class);this

Criterion cron = Restrictions.like("customer",name);

cri.add(cron);

list = cri.list();

==============================

比較運算符

HQL運算符 QBC運算符 含義

= Restrictions.eq() 等於

<> Restrictions.not(Exprission.eq()) 不等於

> Restrictions.gt() 大於

>= Restrictions.ge() 大於等於

< Restrictions.lt() 小於

<= Restrictions.le() 小於等於

is null Restrictions.isnull() 等於空值

is not null Restrictions.isNotNull() 非空值

like Restrictions.like() 字符串模式匹配

and Restrictions.and() 邏輯與

and Restrictions.conjunction() 邏輯與

or Restrictions.or() 邏輯或

or Restrictions.disjunction() 邏輯或

not Restrictions.not() 邏輯非

in(列表) Restrictions.in() 等於列表中的某一個值

ont in(列表) Restrictions.not(Restrictions.in())不等於列表中任意一個值

between x and y Restrictions.between() 閉區間xy中的任意值

not between x and y Restrictions.not(Restrictions..between()) 小於值X或者大於值y

3: HQL

String hql = "select s.name ,avg(s.age) from Student s group by s.name";

Query query = session.createQuery(hql);

list = query.list();

....

4: 本地SQL查詢

session = sessionFactory.openSession();

tran = session.beginTransaction();

SQLQuery sq = session.createSQLQuery(sql);

sq.addEntity(Student.class);

list = sq.list();

tran.commit();

16.1. 建立一個Criteria 實例

org.hibernate.Criteria接口表示特定持久類的一個查詢。Session是 Criteria實例的工廠。

Criteria crit = sess.createCriteria(Cat.class);

crit.setMaxResults(50);

List cats = crit.list();

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

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

16.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");

}

16.5. 動態關聯抓取

你可使用setFetchMode()在運行時定義動態關聯抓取的語義。

List cats = sess.createCriteria(Cat.class)

.add( Restrictions.like("name", "Fritz%") )

.setFetchMode("mate", FetchMode.EAGER)

.setFetchMode("kittens", FetchMode.EAGER)

.list();

這個查詢能夠經過外鏈接抓取mate和kittens。 查看第 20.1 節 「 抓取策略(Fetching strategies) 」能夠得到更多信息。

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

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

16.8. 離線(detached)查詢和子查詢

DetachedCriteria類使你在一個session範圍以外建立一個查詢,而且可使用任意的 Session來執行它。

DetachedCriteria query = DetachedCriteria.forClass(Cat.class)

.add( Property.forName("sex").eq('F') );

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

Hibernate中Criteria的完整用法

最近在項目中使用 Spring 和 Hibernate 進行開發,有感於 Criteria 比較好用,在查詢方法

設計上能夠靈活的根據 Criteria 的特色來方便地進行查詢條件的組裝。如今對 Hibernate的Criteria 的用法進行總結:

   Hibernate 設計了 CriteriaSpecification 做爲 Criteria 的父接口,下面提供了 Criteria和DetachedCriteria 。

Criteria 和 DetachedCriteria 的主要區別在於建立的形式不同, Criteria 是在線的,所

以它是由 Hibernate Session 進行建立的;而 DetachedCriteria 是離線的,建立時無需

Session,DetachedCriteria 提供了 2 個靜態方法 forClass(Class) 或 forEntityName(Name)

進行DetachedCriteria 實例的建立。 Spring 的框架提供了getHibernateTemplate

().findByCriteria(detachedCriteria) 方法能夠很方便地根據DetachedCriteria 來返回查詢結

果。

Criteria 和 DetachedCriteria 都可使用 Criterion 和 Projection 設置查詢條件。能夠設

置 FetchMode( 聯合查詢抓取的模式 ) ,設置排序方式。對於 Criteria 還能夠設置 FlushModel

(沖刷 Session 的方式)和 LockMode (數據庫鎖模式)。

下面對 Criterion 和 Projection 進行詳細說明。

     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(Object

entity) ,即根據一個對象(實際使用中通常是映射到數據庫的對象)來建立。而後能夠設置一些

過濾條件:

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

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

相關文章
相關標籤/搜索