有没有办法引用 HQL 子查询列?

Is there a way to refer to a HQL subquery column?

我想执行一个 HQL 查询(通过 Spring 数据的 @Query),它从 message 中选择在字段 a 中具有匹配最新值的值的记录消息的值,以及在其他字段上匹配某些条件。

我认为最明显的方法是使用一个子查询,该子查询按 createTime 字段最大化记录,按 a 对它们进行分组,然后从子查询中引用此列。但是,我无法创建可以编译的 HQL。有没有办法引用子查询的列,或者我应该尝试不同的方法来解决这个问题?

我尝试使用的 HQL 表达式:

select m from Message m where m.a = (
    select m2.a, max(m2.createTime) from Message m2
    where ... (additional conditions)
).a

不幸的是,它在编译时抛出了 java.lang.NullPointerException

这是典型的每个类别的前 N ​​个查询(在您的例子中 N = 1):

SELECT m
FROM Message m 
WHERE NOT EXISTS (
  FROM Message m2
  WHERE m2.a = m.a
  AND m2.createTime > m.createTime
)

换句话说,查找在同一 "category" m.a.

中不存在更新消息的所有消息

不幸的是,HQL 似乎没有提供比在此处自反加入消息 table 更好的方法,这很可能对大型 table 产生不良性能,即使在 (a, create_time) 上有一个索引。如果这证明是个问题,您仍然可以尝试 SQL 解决方案。根据您的 RDBMS,您应该能够通过一次访问消息 table.

来完成此操作