假设我有一个 session 实体。每个 session 都有一个与会者和一个 session 日期。在我的 session 表中,我可能为每个与会者安排多个 session ,每个 session 的日期不同。我需要一个 JPA 查询,它只为所有与会者选择最新的 session 。例如,如果我的表看起来像这样
Meeting ID | Attendee ID | Meeting Date
1 | 1 | 6/1/2011
2 | 2 | 6/1/2011
3 | 1 | 6/6/2011
4 | 3 | 6/6/2011
我的结果应该是
Meeting ID | Attendee ID | Meeting Date
2 | 2 | 6/1/2011
3 | 1 | 6/6/2011
4 | 3 | 6/6/2011
对 postgres 使用 JPA 2。 session 有 1-1 到与会者和一个简单的时间戳日期。我怀疑我需要通过和 max(blah) 进行分组,也许还需要加入自己,但我不确定解决这个问题的最佳方法。
更新: 在玩了一个晚上之后,我仍然没有可以接受的 JPQL 解决方案。这是我目前所拥有的:
select m from Meeting m
where m.meetingDate in
( select max(meet.meetingDate)
from Meeting meet group by meet.attendee )
我还有其他各种与此问题无关的条件,例如按与会者部门过滤等等。这样做的唯一原因是因为我们将 session 日期跟踪到第二个(或更精细),并且在完全相同的时间举行两次 session 的可能性很小。我们在它周围放了一些 java 的东西,以便只为每个与会者保留最后一次 session ,以防我们同时得到两个,但这是一个非常糟糕的解决方案。在查询中获取所有内容确实应该不难,但我还没有弄清楚。
Update2: 添加 sql 标签,因为如果我需要使用 sql 创建 View 并创建 JPA 对象以映射到 View ,我可以这样做。
最佳答案
在 SQL 中,解决方案非常简单 - 使用子查询连接表,从而为您提供每位与会者最近的 session :
select * from Meeting ALL
join ( select max(meetingDate) as newest, attendee
from Meeting group by attendee ) LATEST
on ALL.meetingDate = LATEST.newest AND ALL.attendee = LATEST.attendee
这很有效,而且效果很快!
JPA 的问题在于它(或大多数实现)不允许连接的子查询。在花了几个小时尝试首先编译什么,然后,它有多慢,我决定我讨厌 JPA。上述解决方案 - 如 EXISTS (SELECT .. ) 或 IN (SELECT .. ) - 需要很长时间才能执行,比它们应该慢几个数量级。
拥有一个有效的解决方案意味着我只需要从 JPA 访问该解决方案。 SQL 中有两个神奇的词可以帮助您做到这一点:
CREATE VIEW
生活变得如此简单......只需定义这样的实体并使用它。 注意:它是只读的。
当然,当你这样做时,任何 JPA 纯粹主义者都会看不起你,所以如果有人有纯粹的 JPA 解决方案,请告诉我们!
关于java - JPA 为每个项目选择最新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6296347/