EJB 3.0(Public Draft)入門記 Java Persistence API Chapter4 その7

EJB QL の GROUP BY と HAVINGについてです。
EJB QLを使って動かしてみますが、エンティティの定義はChapter 4 その4で作成したものを使います。

4.7 GROUP BY, HAVING

SQLと同じようなものですね。こんな感じです。

select count(l) from LineItem l group by l.order having count(l) > 2


ただ次のは駄目でした。

select l.order, count(l) from LineItem l group by l.order having count(l) > 2 --誤ったクエリ

「 l.order 」だとOrderエンティティにマップされたカラムすべてがSQLに変換されたクエリのSELECT節に入ってしまうからです。「 l.order.id 」と指定してあげればOKです。

select l.order.id, count(l) from LineItem l group by l.order having count(l) > 2

どちらも group by の後ろは「 l.order 」なんですけどね。

ところで知らなかったんですが、HAVINGってGROUP BYとセットでなくても使えるんですね。GROUP BYがない場合はクエリの結果がひとつのグループとして扱われるらしいです。どういうときに使えばうれしいんでしょう?ちなみに、HSQLDB1.7.2はHAVING単独は許してくれませんでした。

追記
最初 count(*)というふうに * を使っていたんですがEJB QL的には正式ではないかもしれないので識別変数使うように変えました。ただJBossのEmbeddable EJB 3.0 Alpha 3でcount(*)が使えるのは確かです。