有没有办法引用 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.
来完成此操作
我想执行一个 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.