2012-03-06 60 views
5

我想編寫一個方法,返回按字段'serviceId'分組的最後添加對象的列表。使用Hibernate Criteria API編寫HQL子句

以下HQL的作品,但我想寫這使用標準API:

FROM Notification WHERE date IN 
    (SELECT MAX(date) FROM Notification GROUP BY serviceId) 
ORDER BY date ASC 

事情是這樣的:

Criteria crit = session.createCriteria(Notification.class); 
crit.add(Restrictions.in("date", <MAX dates>)); 
criteria.addOrder(Order.desc("date")); 

在此先感謝。

編輯:

現在我需要的是適用於使用的EclipseLink API =/
基本上類似的查詢,我所需要的最後N行(最大日期),其狀態被描述在下面的五個之一,按serviceId列分組。
由於缺乏經驗我,這是盡我所能:

ExpressionBuilder builder = new ExpressionBuilder(); 
Expression exStatus1 = builder.get("status").equal(MessageType.START.toString()); 
Expression exStatus2 = builder.get("status").equal(MessageType.RUNNING.toString()); 
Expression exStatus3 = builder.get("status").equal(MessageType.PAUSED.toString()); 
Expression exStatus4 = builder.get("status").equal(MessageType.END_ERROR.toString()); 
Expression exStatus5 = builder.get("status").equal(MessageType.END_SUCCESS.toString()); 

ReadAllQuery query = new ReadAllQuery(); 
query.setReferenceClass(Notification.class); 
query.setSelectionCriteria(((exStatus1).or(exStatus2).or(exStatus3).or(exStatus4).or(exStatus5))); 
query.setMaxRows(listSize); 
query.addDescendingOrdering("date"); 

避免重複serviceIds在結果行缺少該條款...

回答

4

你會想使用的標準投影帶有分離子查詢的API:

Criteria crit = session.createCriteria(Notification.class, "main"); 

DetachedCriteria notificationSubQuery = DetachedCriteria.forClass(Notification.class, "sub"); 
notificationSubQuery.setProjection(Projections.max("date")); 
notificationSubQuery.add(Restrictions.eqProperty("sub.serviceId", "main.serviceId")); 

crit.add(Subqueries.propertyIn("date", notificationSubQuery)); 
crit.addOrder(Order.desc("date")); 

這反映了您在HQL查詢中使用的技術。

編輯

我更新了查詢到您的主通知類和你的子查詢,基本上是相同的,因爲這HQL查詢之間的匹配服務Id:

FROM Notification main WHERE date IN 
    (SELECT MAX(sub.date) FROM Notification sub WHERE sub.serviceId = main.serviceId) 
ORDER BY date ASC 

這可以防止的情況下,你會有兩個不同的serviceIds之間的非最大日期匹配,如下所示:

serviceId = 1: date = 3,4,5 
serviceId = 2: date = 4,5,6 

舊的查詢返回:

serviceId: 1, date: 5 
serviceId: 2, date: 5,6 

新建查詢返回:

serviceId: 1, date: 5 
serviceId: 2, date: 6 

讓我知道這對你的作品。

+1

但是,OP希望子查詢是'從通知組中選擇max(date)by serviceId',而不是'從通知中選擇max(日期)「 – 2012-03-07 01:23:41

+0

我的錯誤已更新。 – 2012-03-07 02:12:01

+0

工作正常!謝謝。 – elias 2012-03-07 15:04:09

相關問題