Hibernate Criteria Query查詢

Hibernate這節官網鏈接:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/querycriteria.html html

1.建立標準查詢 java

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


Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2.限制查詢的結果集


一個單獨的查詢條件是的一個實例org.hibernate.criterion.Criterion接口。類org.hibernate.criterion.Restrictions定義工廠方法得到某些內置的標準類型。 sql


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();
官網還有不少不少, 當查詢數據時,人們每每須要設置查詢條件。在SQL或HQL語句中,查詢條件經常放在where子句中。此外,Hibernate還支持Criteria查詢(Criteria Query),這種查詢方式把查詢條件封裝爲一個Criteria對象。在實際應用中,使用Session的createCriteria()方法構建一個org.hibernate.Criteria實例,而後把具體的查詢條件經過Criteria的add()方法加入到Criteria實例中。這樣,程序員能夠不使用SQL甚至HQL的狀況下進行數據查詢,


例如: session

Criteria cr = session.createCriteria(Student.class); //生成一個Criteria對象
cr.add(Restrictions.eq("name", "Bill"));//等價於where name=’Bill’
List list = cr.list();
Student stu = (Student)list.get(0);
System.out.println(stu.getName());


1.經常使用的查詢限制方法 less

Restrictions.eq()方法表示equal,即等於的狀況。Restrictions類提供了查詢限制機制。它提供了許多方法,以實現查詢限制。這些方法及其餘一些criteria經常使用查詢限制方法
函數

  this

  spa

Restrictions.eq() hibernate

equal=

Restrictions.allEq()

參數爲Map對象,使用key/value進行多個等於的對比,至關於多個Restrictions.eq()的效果

Restrictions.gt()

greater-than, >

Restrictions.lt()

less-than, <

Restrictions.le()

less-equal, <=

Restrictions.between()

對應SQLbetween子句

Restrictions.like()

對應SQLlike子句

Restrictions.in()

對應SQLin子句

Restrictions.and()

and關係

Restrictions.or()

or關係

Restrictions.isNull()

判斷屬性是否爲空,爲空返回true,不然返回false

Restrictions.isNotNull()

Restrictions.isNull()相反

Order.asc()

根據傳入的字段進行升序排序

Order.desc()

根據傳入的字段進行降序排序

MatchMode.EXACT

字符串精確匹配,至關於「like 'value'

MatchMode.ANYWHERE

字符串在中間位置,至關於「like '%value%'

MatchMode.START

字符串在最前面的位置,至關於「like 'value%'

MatchMode.END

字符串在最後面的位置,至關於「like '%value'


例1:查詢學生名字以t開頭的全部Student對象。


Criteria cr = session.createCriteria(Student.class);
cr.add(Restrictions.like(「name」, 「t%」))
List list = cr.list();
Student stu = (Student)list.get(0);
或者使用另外一種方式:



Criteria cr = session.createCriteria(Student.class);
cr.add(Restrictions.like(「name」, 「t」, MatchMode.START))
List list = cr.list();
Student stu = (Student)list.get(0);
例2:查詢學生姓名在Bill, Jack和Tom之間的全部Student對象。



String[] names = {「Bill」, 「Jack」, 「Tom」}
Criteria cr = session.createCriteria(Student.class);
cr.add(Restrictions.in(「name」, names))
List list = cr.list();
Student stu = (Student)list.get(0);
例3:查詢學生的年齡age等於22或age爲空(null)的全部Student對象。


Criteria cr = session.createCriteria(Student.class);
cr.add(Restrictions.eq(「age」, new Integer(22));
cr.add(Restrictions.isNull(「age」));
List list = cr.list();
Student stu = (Student)list.get(0);
例4:查詢學生姓名以字母F開頭的全部Student對象,並按姓名升序排序。


Criteria cr = session.createCriteria(Student.class);
cr.add(Restrictions.like(「name」, 「F%」);
cr.addOrder(Order.asc(「name」));
List list = cr.list();
Student stu = (Student)list.get(0);

調用Order.asc的方法應是Criteria的addOrder()方法。

使用add()方法加入條件時,預設是使用and來組合條件,若是要用or的方式來組合條件,則可使用Restrictions.or()方法,例如結合age等於(eq)20或(or)age爲空(isNull)的條件:



Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.or(
Restrictions.eq("age", new Integer(20)),
Restrictions.isNull("age")
));
List users = criteria.list()

觀察所產生的SQL語句,將使用where與or子句完成SQL的條件查詢

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=? or this_.age is null)
使用Criteria進行查詢時,不只僅能組合出SQL中where子句的功能,還能夠組合出如排序、統計、分組等的查詢功能。這就是Criteria進階查詢。

排序
您可使用Criteria進行查詢,並使用org.hibernate.criterion.Order對結果進行排序,例如使用Oder.asc(),指定根據」age」由小到大排序(反之則使用desc()):

Criteria criteria = session.createCriteria(User.class);
criteria.addOrder(Order.asc("age"));
List users = criteria.list();
注意在加入Order條件時,使用的是addOrder()方法,而不是add()方法,在產生SQL語句時,會使用order by與asc(desc)來進行排序指定:


Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ order by this_.age asc
限定查詢筆數
Criteria的setMaxResults()方法能夠限定查詢回來的筆數,若是配合setFirstResult()設定傳回查詢結果第一筆資料的位置,就能夠實現簡單的分頁,例如傳回第51筆以後的50筆資料(若是有的話):

Criteria criteria = session.createCriteria(User.class);
criteria.setFirstResult(51);
criteria.setMaxResults(50);
List users = criteria.list();
根據您所指定得資料庫,Hibernate將自動產生與資料庫相依的限定筆數查詢子句,例如在MySQL中,將使用limit產生如下的SQL語句:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?
統計動做
您能夠對查詢結果進行統計動做,使用 org.hibernate.criterion.Projections的avg()、rowCount()、count()、max()、min ()、 countDistinct()等方法,再搭配Criteria的setProjection()方法加入條件設定,例如對查詢結果的"age"做平均:

Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.avg("age"));
List users = criteria.list();
上面的程式將由Hibernate自動產生SQL的avg函數進行平均計算:

Hibernate: select avg(this_.age) as y0_ from T_USER this_
分組
還能夠配合Projections的groupProperty()來對結果進行分組,例如以"age"進行分組,也就是若是資料中"age"若是有 20、20、2五、30,則如下會顯示20、2五、30:

Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(Projections.groupProperty("age"));
List users = criteria.list();
上面的程式將由Hibernate自動產生SQL的group by子句進行分組計算:

Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age
若是想同時結合統計與分組功能,則可使用org.hibernate.criterion.ProjectionList,例以下面的程式會計算每一個年齡各有多少我的:

ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.groupProperty("age"));
projectionList.add(Projections.rowCount());
Criteria criteria = session.createCriteria(User.class);
criteria.setProjection(projectionList);
List users = criteria.list();
觀察所產生的SQL語句,將使用group by先進行分組,再針對每一個分組進行count函數的計數

Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age
根據已知物件進行查詢
設定查詢條件並不是必定要使用Restrictions,若是屬性條件不少,使用Restrictions也不方便,若是有一個已知的物件,則能夠根據這個物件做爲查詢的依據,看看是否有屬性與之相似的物件,例如:

User user = new User();
user.setAge(new Integer(30));
Criteria criteria = session.createCriteria(User.class);
criteria.add(Example.create(user));
List users = criteria.list();
Criteria進階查詢中,您能夠透過 org.hibernate.criterion.Example的create()方法來創建Example實例,Example實做了 Criteria介面,所以可使用add()方法加入至Criteria條件設定之中,Hibernate將自動過濾掉空屬性,根據已知物件上已設定的屬性,斷定是否產生於where子句之中:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)
設定SQL範本
若是您瞭解如何撰寫SQL語句,想要設定一些Hibernate產生SQL時的範本,您也可使用Restrictions的sqlRestriction()方法,提供SQL語法範本做限定查詢,例如查詢name以cater開頭的資料:

Criteria criteria = session.createCriteria(User.class);
criteria.add(Restrictions.sqlRestriction(
"{alias}.name LIKE (?)", "cater%", Hibernate.STRING));
List users = criteria.list();
其中alias將被替換爲與User類別相關的名稱,而? 將被替換爲cater%,也就是第二個參數所提供的值,sqlRestriction()方法第一個參數所設定的是where子句的部份,因此在SQL撰寫時,沒必要再寫where,觀察所產生的SQL語句,將使用您所設定的SQL範本做爲基礎,來完成SQL的條件查詢:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.name LIKE (?)
若是有多個查詢條件,例如between子句的查詢,則能夠以下:

Criteria criteria = session.createCriteria(User.class);
Integer[] ages = {new Integer(20), new Integer(40)};
Type[] types = {Hibernate.INTEGER, Hibernate.INTEGER};
criteria.add(Restrictions.sqlRestriction(
"{alias}.age BETWEEN (?) AND (?)", ages, types));
List users = criteria.list();
觀察所產生的SQL語句以下:

Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where this_.age BETWEEN (?) AND (?)
相關文章
相關標籤/搜索