Java JPA查询:使用分组条件连接子查询

Java JPA查询:使用分组条件连接子查询,java,sql,spring-data-jpa,hql,jpql,Java,Sql,Spring Data Jpa,Hql,Jpql,我有一个表示特定对象的更改事件的实体。比如: @Entity public class Event { @Id private String eventId; private String objectId; private Instant creationDate; // other fields, getters, setters } 对于特定的objectId,可能有多个事件对象 现在我需要查询每个objectId的所有最新事件(那些通过objec

我有一个表示特定对象的更改事件的实体。比如:

@Entity
public class Event {
    @Id
    private String eventId;
    private String objectId;
    private Instant creationDate;
    // other fields, getters, setters
}
对于特定的
objectId
,可能有多个事件对象

现在我需要查询每个
objectId
的所有最新事件(那些通过
objectId
摸索max
creationDate的事件)

如果是纯SQL,我将编写以下查询:

SELECT event.*
FROM
  event event
  JOIN (
         SELECT
           e.object_id          object_id,
           MAX(e.creation_date) last_date
         FROM event e
         GROUP BY e.object_id
       ) latest_event
    ON latest_event.object_id = event.object_id
       AND event.creation_date = latest_event.last_date
但不幸的是,类似的连接在JPA查询中不起作用

问题:如何在JPA查询中加入子查询

在我的例子中,使用本机查询不是一个选项,因为我使用带有分页功能的SpringDataJPA存储库,这对本机查询不起作用

@Query( 
    value = "SELECT e FROM Event e " + 
            "WHERE e.creationDate = " +
            "(SELECT max(e2.creationDate) FROM Event e2 " + 
            "WHERE e2.objectId = e.objectId)"
)
如果两个相等的最大创建日期在同一对象id中

SELECT ev.*
FROM Event ev
INNER JOIN 
      (SELECT max(id) AS id
       FROM Event e
       INNER JOIN 
              (SELECT object_id, MAX(creation_date) AS last_date
               FROM Event GROUP BY object_id
              ) groupedEvent 
       ON e.object_id = groupedEvent.object_id
       AND e.creation_date = groupedEvent.last_date
       GROUP BY e.object_id) dist 
ON ev.id = dist.id;

```

这行不通。您忽略子查询中的
objectId
,这意味着您计算的最大日期与对象没有关系。@OleksandrShpota每行都有一个由自己选择的最大日期objectId,这是我的错。不知何故,我认为子查询在查询的第三行结束。让我检查一下它是如何工作的。如果两个objectId的最大创建日期相等,这将不起作用。@Rohit如果我们有两个
objectId
,并且都有一个Y
creationDate',并且Y是
max creationDate`,which select?为什么您的
NATURAL JOIN
ON
子句??
NATURAL JOIN
在JPA查询语言中不受支持。除此之外,您的查询与我已经尝试过的类似-它不起作用。@有一天,当这是我的错时,
NATURAL JOIN
no need
ON
condition@OleksandrShpota很抱歉无能为力,另一个应该是工作的,你能为不工作提供更多说明吗?我不记得确切的错误,但它只是没有编译查询。
SELECT ev.*
FROM Event ev
INNER JOIN 
      (SELECT max(id) AS id
       FROM Event e
       INNER JOIN 
              (SELECT object_id, MAX(creation_date) AS last_date
               FROM Event GROUP BY object_id
              ) groupedEvent 
       ON e.object_id = groupedEvent.object_id
       AND e.creation_date = groupedEvent.last_date
       GROUP BY e.object_id) dist 
ON ev.id = dist.id;