Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate标准API编写HQL子句_Java_Hibernate_Jakarta Ee_Hql_Criteria Api - Fatal编程技术网

Java 使用Hibernate标准API编写HQL子句

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

我想编写一个方法,返回按字段“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"));

用于避免结果行中的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