Si la requête retourne des valeurs aggrégées, celles ci peuvent être groupées par propriété ou composant :
select cat.color, sum(cat.weight), count(cat) from Cat cat group by cat.color
select foo.id, avg(name), max(name) from Foo foo join foo.names name group by foo.id
Une clause having est aussi permise.
select cat.color, sum(cat.weight), count(cat) from Cat cat group by cat.color having cat.color in (eg.Color.TABBY, eg.Color.BLACK)
Les fonctions SQL et les fonctions d'aggrégations sont permises dans les clauses having et order by, si elles sont supportées par la base de données (ce que ne fait pas MySQL par exemple).
select cat
from Cat cat
join cat.kittens kitten
group by cat.id, cat.name, cat.other, cat.properties
having avg(kitten.weight) > 100
order by count(kitten) asc, sum(kitten.weight) descNotez que ni la clause group by ni la clause order by ne peuvent contenir d'expressions arithmétiques.