我想执行一个HQL查询(通过Spring Data的@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
。
答案 0 :(得分:2)
这是每个类别查询的典型前N名(在您的情况下为N = 1
)
SELECT m
FROM Message m
WHERE NOT EXISTS (
FROM Message m2
WHERE m2.a = m.a
AND m2.createTime > m.createTime
)
换句话说,在同一“类别” m.a
中查找所有不存在最新消息的消息。
不幸的是,HQL似乎没有提供比自抗连接消息表更好的方法,即使在(a, create_time)
上建立索引,它也很可能导致大型表的性能下降。如果发现这是一个问题,您仍然可以尝试使用SQL解决方案。根据您的RDBMS,您应该可以通过对消息表的单次访问来完成此操作。