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

감사합니다.

는 편집 :

지금 내가 다섯 중 하나가 우는 소리를 설명 상태 마지막 N 행 (최대 날짜), 필요, 기본적으로는 EclipseLink의 API =/
을 사용하여 작동 유사한 질의를 필요로한다 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 쿼리에서 사용하는 기술을 반영합니다.

편집 :이 사건 어디를 방지

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

:

나는 당신의 주요 알림 클래스 및 하위 쿼리,이 HQL 쿼리 본질적으로 같은 사이 서비스 id와 일치하는 쿼리를 업데이트 다음과 같이 서로 다른 두 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