« 落書「大大論」 | メイン | 情報知識学会 »

May 26, 2005

Hibernate の Criteria で count

ものは試しということで、java の O/R mapper Hibernate を試してます。で、検索クエリを動的に組み立てるのに超便利な(気がする) Criteria を使ってるときに、こいつで組み立てた検索条件の検索結果の数を知りたい。つまり SELECT COUNT(*) FROM ... がしたい、と。Hibernate 2 まではどうもできなかったっぽいんですが(ちゃんとは調べてないです)、Hibernate 3 ではできるようになってます。

で、この話、Google で日本語で「Hibernate Criteria count」とかしても「できないっぽい」「できません」「HQL使っとけ」てな話ばかりで(3.0が出たばかりだから?)、僕もあやうく諦めるところだったので、ここに「できますよー」と書いときます。

やり方はリファレンス・ドキュメントの 16.7. Projections, aggregation and grouping をどうぞ。うーむ、ちゃんとドキュメント読めってことですね…。でもざっと探してるときに「Projection」なんて言葉じゃ気がつかないよなぁ。

で、検索結果を表示してかつ引っかかった数も出したい、でも同じ条件を2度組み立てるのは嫌だから Criteria をコピーできないかな? と思うのが人情です。実際にはコピーする必要はなくて、setProjection(null) で Projection をクリアして再利用すればいい、と。という話はこのあたり

そんなわけで、

Criteria crit = session.createCriteria(Hoge.class);
crit.add(Restrictions.like("name", "%"+name+"%"));

Integer rowCount = (Integer)crit.setProjection(Projections.rowCount()).uniqueResult();
crit.setProjection(null);
crit.setResultTransformer(Criteria.ROOT_ENTITY);

crit.setMaxResults(20);
List list = crit.list();

という感じ。のはず。

投稿者 ryoji : May 26, 2005 05:32 PM

トラックバック

このエントリーのトラックバックURL:
http://ryoji.sakura.ne.jp/mt/mt-tb.cgi/110

コメント

行きがかり上,GROUP関数を使わなくちゃいけなくなったんですけど,全然Hibernate理解できてないもんで…
助かりました.

投稿者 memoman : January 23, 2006 04:31 AM