Hibernate 有没有方法引用HQL子查询列?

Hibernate 有没有方法引用HQL子查询列?,hibernate,spring-data,hql,Hibernate,Spring Data,Hql,我想执行一个HQL查询(通过Spring数据的@query),它从消息中选择字段a中的值与最新消息值匹配的记录,并在其他字段中匹配某些条件 我看到的最明显的方法是使用一个子查询,它通过createTime字段最大化记录,通过a对它们进行分组,然后从子查询中引用此列。但是,我无法创建将编译的HQL。是否有方法引用子查询的列,或者我应该尝试另一种方法来解决此问题 我尝试使用的HQL表达式: select m from Message m where m.a = ( select m2.a,

我想执行一个HQL查询(通过Spring数据的
@query
),它从
消息
中选择字段
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
):

选择m
来自消息m
不存在的地方(
来自消息m2
式中,m2.a=m.a
和m2.createTime>m.createTime
)
换句话说,在同一“类别”
m.a
中查找所有不存在较新邮件的邮件


不幸的是,HQL似乎没有提供比在这里自反加入消息表更好的方法,这很可能会对大型表产生糟糕的性能,即使索引位于
(a,create_time)
。如果这是一个问题,您仍然可以尝试SQL解决方案。根据您的RDBMS,您应该能够通过对消息表的一次访问来实现这一点。

使用SQL这将相对容易。你真的必须使用HQL吗?@LukasEder我知道如果我使用SQL会很容易,但不幸的是,在这个特定项目中禁止使用本机查询。你知道原因吗?您仍然可以将本机查询的结果映射到您的
消息
实体…@LukasEder首先,为了多功能性-如果我们更改底层数据库实现,本机查询将无法工作(这在将来是可能的情况)。其次,为了一致性,我们在整个项目中都使用HQL(但不是原生的)查询。除此之外,您的项目的现实目标是什么?很可能,这仍然可以用“标准SQL”相当合理地完成。关于第二点,我不太确定我能说什么:)除了:为什么?无论如何我认为您的这种查询在HQL中是不可能的,更不用说以一种性能良好的方式了……这种查询解决了我的问题。令人遗憾的是,HQL既没有
限制
关键字也没有子查询参数引用-任何这些都会让生活变得更轻松:(尽管如此,感谢您的透彻解释!@IvanKozin:您知道什么会让您的生活更轻松…?使用SQL;-)好吧,我走了,值得尝试说服您。