HIbernate + MSSQL查询兼容性

时间:2014-03-01 11:14:21

标签: sql-server hibernate hql

我需要为给定的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的解决方案。

1 个答案:

答案 0 :(得分:0)

糟糕,这可能是一个错字吗?

max(teSub.createdTimestamp)

而不是

max(te.createdTimestamp) 
子查询中的