我很難完成一些我認爲應該很容易的事情。Criteria API。按最新的孩子排序
基本上我有一個OrderBean和一個OrderInsertBean。它們都是映射到一個mySQL表的實體。一個OrderBean可以有多個OrderInsertBean,一個OrderInsertBean只有一個OrderBean。
我正在編寫Hibernate Criteria查詢來構建一個動態查詢,它將從這些表中搜索和排序結果。它大多工作正常,除非當我嘗試通過下一個OrderInsertBean對訂單進行排序時。
您會發現,OrderInsertBean有一個insertDate,並且對於每個Order,我想選擇插入日期大於今天的第一個OrderInsert,並按此日期對訂單進行排序。
在普通SQL中足夠簡單。可以寫成多種方式,但這是做這件事:
select o.*, (select min(oi2.insertDate)
from AIDA_ORDER_INSERT oi2 where oi2.insertDate > curdate()
and oi2.orderId = o.orderId) as insertDateNew
from AIDA_ORDER o
order by insertDateNew
但如何*可以這樣寫的一個Hibernate條件查詢?或者JPA 2標準查詢也不錯。
這是據我已經得到了...
Criteria crit = session.createCriteria(OrderBean.class, "order");
DetachedCriteria subquery = DetachedCriteria.forClass(OrderInsertBean.class, "oi");
subquery.add(Restrictions.ge("oi.insertDate", new Date()));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.min("oi.insertDate"));
projectionList.add(Projections.groupProperty("oi.orderId"));
subquery.setProjection(projectionList);
// How to add the subquery to the main query to get the desired results??
// Finally ordering the results:
crit.addOrder(Order.asc("insertDateNew"));
我想我需要的是子查詢某種方式加入到標準的選擇列表,通過它給它一個別名,然後才能..
但我卡住了,不知道該去哪裏。 任何人都可以幫助一個可憐的傢伙嗎?
感謝
呃,呃...是的。 addOrder在這裏不是問題。我已經掌控了。困難的是我如何將子查詢添加到主要查詢中以獲得由上述sql定義的結果。目前我的代碼根本不起作用。 – user829237 2013-03-15 15:17:20
當我評論時,addOrder不在您的問題中,這似乎是明顯的答案(對我而言)。 – evandongen 2013-03-18 15:20:24