1、Hibernate3的DetachedCriteria使用 (二) 2011-01-14 12:47:52| 分类: Hibernate | 标签:hibernate java |字号 订阅 Criteria對SQL進行封裝,讓開發人員可以用物件的方式來對資料庫進行操作,例如下面的查詢User表格中的所有資料: Criteria criteria = session.createCriteria(User.class); // 查詢user所有欄位 List users = criteria.list(); Iterator iterator = users.it
2、erator(); System.out.println("id \t name/age"); while(iterator.hasNext()) { User user = (User) iterator.next(); System.out.println(user.getId() + " \t " + user.getName() + "/" + user.getAge()); } Hibernate實際上使
3、用以下的SQL來查詢資料庫: select this_.id as id0_, this_.name as name0_0_, this_.age as age0_0_ from user this_ Criteria實際上只是個容器,如果想要設定查詢條件,則要使用add()方法加入Restrictions的條件限制,例如查詢age大於20且小於40的資料: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.gt("age", new Integer(20))); cri
4、teria.add(Restrictions.lt("age", new Integer(40))); List users = criteria.list(); 您也可以使用邏輯組合來進行查詢,例如結合age等於(eq)20或(or)age為空(isNull)的條件: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.or( Restrictions.eq("age", new Integer(20)),
5、 Restrictions.isNull("age") )); List users = criteria.list(); 也可以使用sqlRestriction()方法來提供SQL語法作限定查詢,例如查詢name以cater開頭的資料: Criteria criteria = session.createCriteria(User.class); criteria.add(Restrictions.sqlRestriction("{alias}.name LIKE (?)", "cater%", Hibernate.STRING)
6、); List users = criteria.list(); 其中alias將被替換為與User類別相關的名稱,而?將被替換為cater%,也就是第二個參數所提供的值,在SQL撰寫時,不必再寫WHERE,如果有多個查詢條件,例如BETWEEN子句的查詢,則可以如下: Criteria criteria = session.createCriteria(User.class); Integer[] ages = {new Integer(20), new Integer(40)}; Type[] types = {Hibernate.INTEGER, Hibernate.INTEG
7、ER}; criteria.add(Restrictions.sqlRestriction("{alias}.age BETWEEN (?) AND (?)", ages, types)); List users = criteria.list(); Restrictions的幾個常用限定查詢方法如下表所示: 方法 說明 Restrictions.eq 等於 Restrictions.allEq 使用Map,使用key/value進行多個等於的比對 Restrictions.gt 大於 > Restrictions.ge 大於等於 >= Restrictions.l
8、t 小於 < Restrictions.le 小於等於 <= Restrictions.between 對應SQL的BETWEEN子句 Restrictions.like 對應SQL的LIKE子句 Restrictions.in 對應SQL的in子句 Restrictions.and and關係 Restrictions.or or關係 Restrictions.sqlRestriction SQL限定查詢 前面讲了Criteria看起来比HQL顺眼多了,接着继续。 如果每个美女都有自己的客户资源(不要想歪了!),那么需要查询拥有客户Gates的美女怎么办
9、 使用Criteria可以有两种方法: 1: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createCriteria("customers"); beautyCriteria.add(Restrictions.eq("name", "Gates")): 2: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class).createAlias("customers", "c"); beau
10、tyCriteria.add(Restrictions.eq("c.name", "Gates")): 接着有了新的要求,年纪太大的美女不要,还是查找拥有客户Gates的,条件如下: DetachedCriteria beautyCriteria = DetachedCriteria.forClass(Beauty.class, "b").; DetachedCriteria customerCriteria = beautyCriteria.createAlias("customers", c"); beautyCriteria.add(Restrictions.le("b.age", new Long(20))): customerCriteria.add(Restrictions.eq("c.name", "Gates")): 关于Criteria更详细的资料,Hibernate的源代码和测试是最好的文档。 Criteria的缺点?DBA很生气,后果很严重。 DetachedCriteria 可以脫離 Session 實例獨立存在,這樣,我們就可以將某些通用的 Criteria 查詢條件進行抽離,每次使用時再與當前 Session 實例綁定以獲得更好的代碼重用效果。
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818