2013-03-15 54 views
0

我很難完成一些我認爲應該很容易的事情。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")); 

我想我需要的是子查詢某種方式加入到標準的選擇列表,通過它給它一個別名,然後才能..

但我卡住了,不知道該去哪裏。 任何人都可以幫助一個可憐的傢伙嗎?

感謝

回答

0

你試過添加Order的標準是什麼?

象:Order和OrderInsert之間

crit.addOrder(Order.asc("insertDateNew")); 
+0

呃,呃...是的。 addOrder在這裏不是問題。我已經掌控了。困難的是我如何將子查詢添加到主要查詢中以獲得由上述sql定義的結果。目前我的代碼根本不起作用。 – user829237 2013-03-15 15:17:20

+0

當我評論時,addOrder不在您的問題中,這似乎是明顯的答案(對我而言)。 – evandongen 2013-03-18 15:20:24

0

您已經映射的關聯。這不行嗎?

Criteria crit = session.createCriteria(OrderBean.class, "order"); 

crit.createAlias("orderInserts", "oi"); 

crit.add(Restrictions.ge("oi.insertDate", new Date())); 

ProjectionList projectionList = Projections.projectionList(); 
projectionList.add(Projections.min("oi.insertDate")); 
projectionList.add(Projections.groupProperty("oi.orderId")); 
crit.setProjection(projectionList); 

// Finally ordering the results: 
crit.addOrder(Order.asc("oi.insertDateNew"));