HQL version of a SQL join with group by HQL version of a SQL join with group by sql sql

HQL version of a SQL join with group by


In HQL, could you give this a try:

select band.name, max(vote.totalVotes)from Band band     join band.votes votegroup by band.nameorder by max(vote.totalVotes) desc

This assumes there is a one-to-many association between Band and Votes (actually, providing the object model is very helpful when working with HQL and/or the Criteria API since you are querying the object model).

Just in case, here is the relevant section of the documentation:

14.12. The group by clause

A query that returns aggregate values can be grouped by any property of a returned class or components:

select cat.color, sum(cat.weight), count(cat)from Cat catgroup by cat.colorselect foo.id, avg(name), max(name)from Foo foo join foo.names namegroup by foo.id

A having clause is also allowed.

select cat.color, sum(cat.weight), count(cat)from Cat catgroup by cat.colorhaving cat.color in (eg.Color.TABBY, eg.Color.BLACK)

SQL functions and aggregate functions are allowed in the having and order by clauses if they are supported by the underlying database (i.e., not in MySQL).

select catfrom Cat cat    join cat.kittens kittengroup by cat.id, cat.name, cat.other, cat.propertieshaving avg(kitten.weight) > 100order by count(kitten) asc, sum(kitten.weight) desc

Neither the group by clause nor the order by clause can contain arithmetic expressions. Hibernate also does not currently expand a grouped entity, so you cannot write group by cat if all properties of cat are non-aggregated. You have to list all non-aggregated properties explicitly.