Question

I need to get the latest "version" of a Task object for a given objectUuid. The Task is identified by its objectUuid, taskName and createdTimestamp attributes.

I had the following HQL query:

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
)

which ran and produced the correct results on H2 (embedded) and MySQL. However after installing this code in production to MS SQL Server I get the following error:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

I tried to rewrite the query but HQL doesn't seem to support subqueries properly. My latest attempt is something like:

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 + "'

but of course it fails at the "(" after the join statement.

Since this is a very frequent type of query I cannot believe there is no solution that works with HQL+MSSQL.

Was it helpful?

Solution

Uh-oh. Can this be a typo?

max(teSub.createdTimestamp)

instead of

max(te.createdTimestamp) 

in the subquery.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top