2012-03-06 9 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")); 

感謝。

EDIT:

今、私は基本的にのEclipseLink API =/
を使用して動作する同様のクエリを必要とする、私は、ステータスが5説明怒鳴るの一つであり、最後の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クエリで使用している手法を反映しています。

EDIT

私はあなたのメインの通知クラスとあなたのサブクエリ間のServiceIDと一致するクエリ、このHQLクエリと本質的に同じ更新:

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

これはあなたのケースを防ぎます次のように2つの異なるserviceId間で一致する最大でない日付があります。

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はサブクエリが「通知からの最大(日付)をserviceIdによって選択する」というだけで、通知から最大(日付)を選択します。 –

+0

私の間違いが更新されました。 –

+0

正常に動作します!ありがとう。 – elias

関連する問題