我想编写一个方法,该方法返回按字段“ serviceId”分组的最后添加的对象的列表。
以下HQL可以使用,但我想使用Criteria 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的子句…
您将要对分离的子查询使用Criteria projections 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查询中使用的技术。
编辑 :
我更新了查询,以使您的主通知类和子查询之间的serviceId匹配,基本上与此HQL查询相同:
FROM Notification main WHERE date IN (SELECT MAX(sub.date) FROM Notification sub WHERE sub.serviceId = main.serviceId) ORDER BY date ASC
这样可以避免在两个不同的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
让我知道这是否适合您。