JPA查询:加入一个带分组条件的子查询
JPA Query: join a subquery with grouping condition
我有一个表示特定对象的更改事件的实体。类似于:
@Entity
public class Event {
@Id
private String eventId;
private String objectId;
private Instant creationDate;
// other fields, getters, setters
}
特定的 objectId
可能有多个事件对象。
现在 我需要查询每个 objectId
的所有最新事件(最大 creationDate
摸索 objectId
的事件)。
如果它是纯的 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 查询中加入子查询?
在我的情况下,使用本机查询不是一个选项,因为我使用 Spring 具有分页功能的数据 JPA 存储库,它不适用于本机查询。
@Query(
value = "SELECT e FROM Event e " +
"WHERE e.creationDate = " +
"(SELECT max(e2.creationDate) FROM Event e2 " +
"WHERE e2.objectId = e.objectId)"
)
SELECT *
FROM Event
NATURAL JOIN
(SELECT object_id, MAX(creation_date) AS creation_date
FROM Event
GROUP BY object_id) groupedEvent
如果两个相等的最大值creation_date在同一个object_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;
```
我有一个表示特定对象的更改事件的实体。类似于:
@Entity
public class Event {
@Id
private String eventId;
private String objectId;
private Instant creationDate;
// other fields, getters, setters
}
特定的 objectId
可能有多个事件对象。
现在 我需要查询每个 objectId
的所有最新事件(最大 creationDate
摸索 objectId
的事件)。
如果它是纯的 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 查询中加入子查询?
在我的情况下,使用本机查询不是一个选项,因为我使用 Spring 具有分页功能的数据 JPA 存储库,它不适用于本机查询。
@Query(
value = "SELECT e FROM Event e " +
"WHERE e.creationDate = " +
"(SELECT max(e2.creationDate) FROM Event e2 " +
"WHERE e2.objectId = e.objectId)"
)
SELECT *
FROM Event
NATURAL JOIN
(SELECT object_id, MAX(creation_date) AS creation_date
FROM Event
GROUP BY object_id) groupedEvent
如果两个相等的最大值creation_date在同一个object_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;
```