java - JPA 为每个项目选择最新实例

标签 java sql jpa jpa-2.0 jpql

假设我有一个 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/

相关文章:

mysql - 如何使用查询 DSL 连接表

java - Spring boot中的PostgreSQL继承命名问题

java - 部分代码未初始化

java - 在 Java 中什么是嵌套类,它们有什么作用?

MySQL 其中 x 中的 2 个

php - 无法创建mysql表

java - 如何防止 JPA 查询包含 String 构造函数,当 null String 值仅可用时抛出 NullPointerException

java - 来自 URL 的 GWT RPC 调用

java - Spring Hibernate - 查找与另一个实体的字段匹配的实体

sql - Azure SqlExceptions