8

HQLにROWIDやROWNUMなどの行を識別するためのキーワードがあるかどうか誰かが知っていますか?

HQLでページネーションを実装したいのですが、セッションオブジェクトを直接操作しないため、.setMaxResult()または.setFirstResult()を使用できません。したがって、Queryオブジェクトを使用せず、クエリを次のように作成するだけです。文字列を作成し、.find()メソッドを使用します。

クエリでLIMITとOFFSETを使用しようとしましたが、HQLはこれらのキーワードを無視しているようで、何があっても結果全体が返されます。

また、クエリに表示される「HAVING」句がサポートされていないため、Hibernate基準を使用できません。

私の最後の手段は、ROWNUM/ROWIDキーワードを使用して結果セットを制限することです。他に何か提案はありますか?

4

3 に答える 3

18

これは、休止状態が輝く 1 つの状況です。

hqlクエリを使用した典型的なソリューション。

int elementsPerBlock = 10;
int page = 2;

return  getSession().createQuery("from SomeItems order by id asc")
            .setFirstResult(elementsPerBlock * (page-1) + 1 )
            .setMaxResults(elementsPerBlock)
            .list();

hibernate はこれを、SQL ダイアレクトに従ってデータベースが理解できるパターンに変換します。オラクルでは、ROWNUM < X でサブセレクトを作成します。postgresql では、msSQL サーバーで LIMIT / OFFSET を発行し、TOP を発行します。

私の知る限り、「純粋な」hqlでこれを達成することはできません。

于 2009-05-08T14:38:52.943 に答える