JPQLのHAVING句
The HAVING clause must specify search conditions over the grouping items or aggregate functions that apply to grouping items.
ドキュメントに上のようにあるのですが、JPQLのHAVING句ってなんだか制限がきついですね。
下の3つのJPQL(それぞれHAVING句のあたりだけ微妙に違う)ですが、正しいのは 1)だけで 2) と 3) は構文的に正しくないようです。
Hibernateはまぁどれも許してくれるのですが、TopLinkだと 2) と 3) は怒られます。
■1)JPQL的に正しい。HibernateでもTopLinkでもOK
SELECT e.weight, COUNT(e) FROM Employee AS e
GROUP BY e.weight
HAVING (COUNT(e.weight) > 1)
ORDER BY e.weight
■2)JPQL的に正しくないっぽい。HibernateではOK、TopLinkではNG
SELECT e.weight, COUNT(e) FROM Employee AS e
GROUP BY e.weight
HAVING (COUNT(e) > 1)
ORDER BY e.weight
SELECT句では指定できるCOUNT(e)がそのままHAVING句で使えないのです。感覚的ではないですね。
■3)JPQL的に正しくないっぽい。HibernateではOK、TopLinkではNG
SELECT e.weight, COUNT(e) FROM Employee AS e
GROUP BY e.weight
HAVING (COUNT(e.height) > 1)
ORDER BY e.weight
SQLではGROUP BY句に指定した以外のカラムを使った集計関数をHAVING句で使うことって普通にあると思いますが、JPQLでは駄目みたいです。