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