需要從兩個關聯進行數據查詢。找了一下午,可算找到個能看懂的
原文鏈接:http://blog.sina.com.cn/s/blog_ba1bed340101lvx1.html
從數據庫查詢的sql語句如下:
select * from bdorder where Id in (select DISTINCT details from orderDetail " + "where detailStatus like '%3N') " + "and status like '%3Y'
項目中使用的是hibernate框架。
使用到criteria ,DetachedCriteria 單個表用的時候那是相當方便,第一次多表查詢,就有點蒙了,
首先是單個表的查詢
1 order實體 2 3 //對order表進行查詢 4 //初始化criteria 5 DetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class); 6 7 //給criteria添加條件,引號中status為實體中的字段,后一個為值 8 criteria.add(Restrictions.like("status", states)); 9 10 //添加多個條件。有多少加多少。 11 ... 12 ... 13 14 //查找結果。 15 List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria);
兩個表的查詢,實現最開始的sql語句
1 BDOrder 實體和 BDOrderDetail 實體 2 DetachedCriteria criteria = DetachedCriteria.forClass(BDOrder.class); 3 4 //添加查詢條件 5 criteria.add() 6 7 //初始化BDOrderDeaila 的criterial 8 DetachedCriteria criteriaDetail = DetachedCriteria.forClass(BDOrderDetail.class); 9 10 //添加OrderDetail實體的查詢條件 11 criteriaDetial.add(Restrictions.like("detailStatus", "%3N")) 12 13 //設置這個表的查詢結果。注意details為實體映射文件中對應的字段,不是數據庫中的列名 14 criteriaDetail.setProjection(Property.forName("details ")); 15 16 //設置去除查詢結果中的重復數據 17 criteriaDetail.setResultTransformer(criteriaDetail.DISTINCT_ROOT_ENTITY); 18 19 20 //關聯兩個實體的關系 21 criteria.add(Property.forName("id").in(criteriaDetail)); 22 23 24 //然后直接使用criteria去查詢就可以了。 25 //查找結果。 26 List<BDOrder> orderList = this.getHibernateTemplate().findByCriteria(criteria); 27 28 //以上可以實現最開始的那句sql,
順便復習一下Restrictions的用法:
方法 |
說明 |
Restrictions.eq |
= |
Restrictions.allEq |
利用Map來進行多個等於的限制 |
Restrictions.gt |
> |
Restrictions.ge |
>= |
Restrictions.lt |
< |
Restrictions.le |
<= |
Restrictions.between |
BETWEEN |
Restrictions.like |
LIKE |
Restrictions.in |
in |
Restrictions.and |
and |
Restrictions.or |
or |
Restrictions.sqlRestriction |
用SQL限定查詢 |