BitArts Blog

ロードバイク通勤のRubyプログラマで伊豆ダイバー。の個人的なブログ。

Hibernateでページめくり処理

ちょうど@ITの会議室とか、koichik氏のBlogに出てて、そういえば思い出したのでメモ。Hibernateで一覧表示みたいのを作った時に「次の10件」みたいな処理をしたい時、HQLにoffset句、limit句を書けるよ。という話を前に書いた。けど、この方法だとPostgreSQL依存になってしまうので、QueryクラスのsetFirstResult(int)、setMaxResults(int)メソッドを使うのが正解です。こりゃ大変スマートで良いっすな。(EJB3.0にはまるっきり同名のクラス、メソッドがあるそうな)

あと、koichik氏のBlogにもある通り、こういった一覧を取得する方法としてListを返す系のQuery#list()とSession#find(String)。Iteratorを返す系のQuery#iterate()とSession#iterate(String)がある。直感的になんとなくIteratorのほうが効率が良さそうに感じるのだけど、こちらはIterator#next()する度にクエリーを投げる仕組みなので、メモリ効率は良いかもしれないが、パフォーマンスは悪い。通常はList系のほうを使ったほうが良さそう。Iterator系のほうは、結果行数が予測不可能なほどデカくなる可能性がある場合にのみ使うことになるのかな。