Java 使用Hibernate标准API编写HQL子句
我想编写一个方法,返回按字段“serviceId”分组的最后添加的对象列表 以下HQL可以工作,但我想使用Criteria API编写此代码:Java 使用Hibernate标准API编写HQL子句,java,hibernate,jakarta-ee,hql,criteria-api,Java,Hibernate,Jakarta Ee,Hql,Criteria Api,我想编写一个方法,返回按字段“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
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"));
用于避免结果行中的ServiceID重复的子句丢失…您需要将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
让我知道这是否适用于您。但OP希望子查询是
按serviceId从通知组中选择最大(日期)
,而不是从通知中选择最大(日期)
serviceId: 1, date: 5
serviceId: 2, date: 6