15.16. Tips & Tricks
実際に結果を返さなくてもクエリの結果数を数えることができます:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue()
コレクションのサイズにより結果を並べ替えるためには以下のクエリを使用します:
select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
order by count(msg)
select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
order by count(msg)
使用しているデータベースがサブセレクトをサポートする場合、クエリの where 節でサイズによる選択条件を設定できます:
from User usr where size(usr.messages) >= 1
from User usr where size(usr.messages) >= 1
使用しているデータベースが副問い合わせ(Subselect)に対応していない場合は、次のクエリを使用してください:
select usr.id, usr.name
from User usr
join usr.messages msg
group by usr.id, usr.name
having count(msg) >= 1
select usr.id, usr.name
from User usr
join usr.messages msg
group by usr.id, usr.name
having count(msg) >= 1
この解決法は、内部結合をしているせいでメッセージの件数がゼロの
User を返すことができないため、以下の形式も役立ちます:
select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
having count(msg) = 0
select usr.id, usr.name
from User as usr
left join usr.messages as msg
group by usr.id, usr.name
having count(msg) = 0
JavaBean のプロパティは、名前付きのクエリパラメータに結びつけることが出来ます:
Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");
q.setProperties(fooBean); // fooBean has getName() and getSize()
List foos = q.list();
Query q = s.createQuery("from foo Foo as foo where foo.name=:name and foo.size=:size");
q.setProperties(fooBean); // fooBean has getName() and getSize()
List foos = q.list();
コレクションはフィルタ付き
Query インターフェースを使用することでページをつけることができます:
Query q = s.createFilter( collection, "" ); // the trivial filter q.setMaxResults(PAGE_SIZE); q.setFirstResult(PAGE_SIZE * pageNumber); List page = q.list();
Query q = s.createFilter( collection, "" ); // the trivial filter
q.setMaxResults(PAGE_SIZE);
q.setFirstResult(PAGE_SIZE * pageNumber);
List page = q.list();
コレクション要素はクエリフィルタを使って、並べ替えやグループ分けが出来ます:
Collection orderedCollection = s.createFilter( collection, "order by this.amount" ).list(); Collection counts = s.createFilter( collection, "select this.type, count(this) group by this.type" ).list();
Collection orderedCollection = s.createFilter( collection, "order by this.amount" ).list();
Collection counts = s.createFilter( collection, "select this.type, count(this) group by this.type" ).list();
コレクションを初期化せずにコレクションのサイズを得ることができます:
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue();
( (Integer) session.createQuery("select count(*) from ....").iterate().next() ).intValue();