使用Criteria進(jìn)行查詢 by 林信良(良葛格)
要對(duì)資料庫管理系統(tǒng)進(jìn)行操作,最基本的就是使用SQL
使用Hibernate時(shí),即使您不了解SQL的使用與撰寫
以最基本的查詢來說,如果您想要查詢某個(gè)物件所對(duì)應(yīng)的資料表中所有
Criteria criteria = session.createCriteria(User.class); List users = criteria.list(); for(Iterator it = users.iterator(); it.hasNext(); ) { User user = (User) it.next(); System.out.println(user.getId() + " \t " + user.getName() + "/" + user.getAge()); }
Criteria建立後,若不給予任何的條件,預(yù)設(shè)是查詢物件所對(duì)
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_
Criteria基本查詢條件設(shè)定
org.hibernate.Criteria實(shí)際上是個(gè)條件附加
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("age", new Integer(20))); criteria.add(Restrictions.lt("age", new Integer(40))); List users = criteria.list(); for(Iterator it = users.iterator(); it.hasNext(); ) { User user = (User) it.next(); System.out.println(user.getId() + " \t " + user.getName() + "/" + user.getAge()); }
Restrictions的gt()方法表示大於(great than)的條件,而lt表示小於(less than)的條件,執(zhí)行以上程式片段,觀察所產(chǎn)生的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>? and this_.age
使用add()方法加入條件時(shí),預(yù)設(shè)是使用and來組合條件,如果要用or的方式來組合條件,則可以使用Restrictions.or()方法,例如結(jié)合age等於(eq)20或(or)age為空
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or( Restrictions.eq("age", new Integer(20)), Restrictions.isNull("age") )); List users = criteria.list();
觀察所產(chǎn)生的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)
您也可以使用Restrictions.like()方法來進(jìn)行SQL中l(wèi)ike子句的功能,例如查詢”name
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.like("name", "just%")); List users = criteria.list();
觀察所產(chǎn)生的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 ?
Restrictions的幾個(gè)常用限定查詢方法如下表所示:
方法 | 說明 |
Restrictions.eq | 等於 |
Restrictions.allEq | 使用Map,使用key/value進(jìn)行多個(gè)等於的比對(duì) |
Restrictions.gt | 大於 > |
Restrictions.ge | 大於等於 >= |
Restrictions.lt | 小於 < |
Restrictions.le | 小於等於 <= |
Restrictions.between | 對(duì)應(yīng)SQL的BETWEEN子句 |
Restrictions.like | 對(duì)應(yīng)SQL的LIKE子句 |
Restrictions.in | 對(duì)應(yīng)SQL的in子句 |
Restrictions.and | and關(guān)係 |
Restrictions.or | or關(guān)係 |
Criteria進(jìn)階查詢條件設(shè)定
使用Criteria進(jìn)行查詢時(shí),不僅僅能組合出SQL中wher
排序
您可以使用Criteria進(jìn)行查詢,並使用org.hibernate.criterion.Order對(duì)結(jié)果進(jìn)行排序,例如使用Oder.asc(),指定根據(jù)”age”由小到大排序(反之則使用desc()
Criteria criteria = session.createCriteria(User.class); criteria.addOrder(Order.asc("age")); List users = criteria.list();
注意在加入Order條件時(shí),使用的是addOrder()方法,而不是add()方法,在產(chǎn)生SQL語句時(shí)
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
限定查詢筆數(shù)
Criteria的setMaxResults()方法可以限定查詢回來的筆數(shù),如果配合setFirstResult()設(shè)定傳回查詢結(jié)果第一筆資料的位置,就可以實(shí)現(xiàn)簡(jiǎn)單的分頁
Criteria criteria = session.createCriteria(User.class); criteria.setFirstResult(51); criteria.setMaxResults(50); List users = criteria.list();
根據(jù)您所指定得資料庫,Hibernate將自動(dòng)產(chǎn)生與資料庫相依
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ limit ?, ?
統(tǒng)計(jì)動(dòng)作
您可以對(duì)查詢結(jié)果進(jìn)行統(tǒng)計(jì)動(dòng)作,使用org.hibernate.criterion
Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.avg("age")); List users = criteria.list();
上面的程式將由Hibernate自動(dòng)產(chǎn)生SQL的avg函數(shù)進(jìn)行
Hibernate: select avg(this_.age) as y0_ from T_USER this_
分組
還可以配合Projections的groupProperty
Criteria criteria = session.createCriteria(User.class); criteria.setProjection(Projections.groupProperty("age")); List users = criteria.list();
上面的程式將由Hibernate自動(dòng)產(chǎn)生SQL的group by子句進(jìn)行分組計(jì)算:
Hibernate: select this_.age as y0_ from T_USER this_ group by this_.age
如果想同時(shí)結(jié)合統(tǒng)計(jì)與分組功能,則可以使用org.hibernate.criterion
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();
觀察所產(chǎn)生的SQL語句,將使用group by先進(jìn)行分組,再針對(duì)每個(gè)分組進(jìn)行count函數(shù)的計(jì)數(shù)
Hibernate: select this_.age as y0_, count(*) as y1_ from T_USER this_ group by this_.age
根據(jù)已知物件進(jìn)行查詢
設(shè)定查詢條件並非一定要使用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();
您可以透過org.hibernate.criterion.Example的create()方法來建立Example實(shí)例
Hibernate: select this_.id as id0_0_, this_.name as name0_0_, this_.age as age0_0_ from T_USER this_ where (this_.age=?)
設(shè)定SQL範(fàn)本
如果您了解如何撰寫SQL語句,想要設(shè)定一些Hibernate產(chǎn)
Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction("{alias}.name LIKE (?)", "cater%", Hibernate.STRING)); List users = criteria.list();
其中alias將被替換為與User類別相關(guān)的名稱,而
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 (?)
如果有多個(gè)查詢條件,例如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();
觀察所產(chǎn)生的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 (?)
使用DetchedCriteria
Criteria與Session綁定,其生命週期跟隨著Sess
為了能夠重複使用Criteria物件,在Hibernate 3中新增了org.hibernate.criterion
// 先建立DetchedCriteria物件 DetachedCriteria detchedCriteria = DetachedCriteria.forClass(User.class); // 加入查詢條件 detchedCriteria.add(Restrictions.ge("age",new Integer(25))); Session session = sessionFactory.openSession(); // 綁定Session並返回一個(gè)Criteria實(shí)例 Criteria criteria = detchedCriteria.getExecutableCriteria(session); List users = criteria.list();
結(jié)論
Hibernate的Criteria API可以讓您使用物件的方式,組合出查詢資料庫系統(tǒng)的條件
posted on 2007-10-11 16:22 zJun's帛羅閣 閱讀(15460) 評(píng)論(0) 編輯 收藏 所屬分類: 開源軟件