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() |
對應SQL的between子句 |
Restrictions.like() |
對應SQL的like子句 |
Restrictions.in() |
對應SQL的in子句 |
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 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 ?, ?統計動做
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_分組
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根據已知物件進行查詢
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範本
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 (?)