JPQLのHAVING句の変な仕様?
JPQLのHAVING句ですが、TopLinkでは以下のクエリが動きませんでした(Hibernateでは問題なく動きます)。
SELECT e.department.id, MAX(e.salary) FROM Employee e GROUP BY e.department.id HAVING MAX(e.salary) > 1000
一見、まったく問題なさそうなのですが、HAVING句に MAX(e.salary) と指定しているのがいけないみたいです。
上のJPQLを実行すると、TopLinkはJPA仕様の4.7の最後にある次の文章を例外のメッセージに含めます。
The HAVING clause must specify search conditions over the grouping items or aggregate functions that apply to grouping items.
つまり、HAVING句に指定できるのは、「GROUP BY句に指定した項目(上の例だとe.department.id)」か「GROUP BY句に指定した項目に対する集計関数(上の例だとCOUNT(e.department.id)とか)」でなければいけないと言いたいらしい。でも、GROUP BY句に指定した項目に対する集計関数って意味ないような。それにgrouping itemsって「GROUP BY句に指定した項目」を指す用語なのかなぁ?
ちなみに、ProEJB 3 のp.217のHAVING句を使ったJPQLがTopLinkでは動きませんでした。仕様じゃなくて僕が使ったTopLink(build35)の不具合のような気もしちゃいます。
おっ、これが関係あるかも。
https://glassfish.dev.java.net/issues/show_bug.cgi?id=1403
GlassFishのバージョン番号で管理されているからCurrentlyってTopLink Essentialsのどのビルドバージョンかわからない...。