我需要为给定的objectUuid获取Task对象的最新“版本”。 Task由objectUuid,taskName和createdTimestamp属性标识。
我有以下HQL查询:
select new list(te) from " + TaskEntity.class.getName() + " te
where
te.objectUuid = '" + domainObjectId + "' and
te.createdTimestamp = (
select max(te.createdTimestamp) from " + TaskEntity.class.getName() + " teSub
where teSub.objectUuid = te.objectUuid and teSub.taskName = te.taskName
)
在H2(嵌入式)和MySQL上运行并生成了正确的结果。 但是,在生产中将此代码安装到MS SQL Server后,我收到以下错误:
聚合可能不会出现在WHERE子句中,除非它在a中 包含在HAVING子句或选择列表中的子查询以及列 被聚合是一个外部参考。
我尝试重写查询,但HQL似乎不能正确支持子查询。我最近的尝试是这样的:
select new list(te) from " + TaskEntity.class.getName() + " te
inner join (
select te2.objectUuid, te2.taskName, max(te2.createdTimestamp)
from " + TaskEntity.class.getName() + " te2
group by te2.objectUuid, te2.taskName
) teSub on
teSub.objectUuid = te.objectUuid and teSub.taskName = te.taskName
where
te.objectUuid = '" + domainObjectId + "'
但当然它在加入声明之后的“(”)失败。
由于这是一种非常频繁的查询类型,我无法相信没有适用于HQL + MSSQL的解决方案。
答案 0 :(得分:0)
糟糕,这可能是一个错字吗?
max(teSub.createdTimestamp)
而不是
max(te.createdTimestamp)
子查询中的。