3

ご清聴ありがとうございました。

JPA 2.0 と Hibernate 4.X を使用して、いくつかの SQL ネイティブ クエリを実行しています。コードは非常に単純です。

private void doIt() throws Exception {
        EntityManager em = getEntityManager();
        Query q = em.createNativeQuery("A very simple native query, which return no entities, but collections of arrays");
        q.setFirstResult(0);
        q.setMaxResults(5);
        Collection<Object> results = q.getResultList();
        System.out.println("1"); //Means page 1
        for (Object elem : results) {
            String line = "";
            Object[] row = (Object[]) elem;
            for (Object object : row) {
                if(object==null){
                    object="null";
                }
                line += object +"("+object.getClass()+")"+ ",";
            }
            System.out.println(row.length + " " + line);

        }


        em = getEntityManager();
        q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays");
        q.setFirstResult(5);
        q.setMaxResults(5);
        results = q.getResultList();
        System.out.println("2"); //Means page 2
       for (Object elem : results) {
            String line = "";
            Object[] row = (Object[]) elem;
            for (Object object : row) {
                if(object==null){
                    object="null";
                }
                line += object +"("+object.getClass()+")"+ ",";
            }
            System.out.println(row.length + " " + line);

        }


        em = getEntityManager();
        q = em.createNativeQuery("The same simple native query, which return no entities, but collections of arrays");
        q.setFirstResult(10);
        q.setMaxResults(5);
        results = q.getResultList();
        System.out.println("3"); //Means page 3
        for (Object elem : results) {
            String line = "";
            Object[] row = (Object[]) elem;
            for (Object object : row) {
                if(object==null){
                    object="null";
                }
                line += object +"("+object.getClass()+")"+ ",";
            }
            System.out.println(row.length + " " + line);

        }
    }

そして私の結果はこれです:

1 
data1,data2,...,data-n        -->I need this output
data1,data2,...,data-n
data1,data2,...,data-n
data1,data2,...,data-n
data1,data2,...,data-n

2
data1,data2,...,data-n,6      -->OMG! lol
data1,data2,...,data-n,7
data1,data2,...,data-n,8
data1,data2,...,data-n,9
data1,data2,...,data-n,10

3
data1,data2,...,data-n,11
data1,data2,...,data-n,12
data1,data2,...,data-n,13
data1,data2,...,data-n,14
data1,data2,...,data-n,15

つまり、最初のページの出力には 1 行あたり n 個のアイテムが含まれています (これが私の目的の出力です) が、2 ページ目と 3 ページ目には n+1 個のアイテムがあり、追加されたアイテムは行の数のように表示されます。

同じことが起きた人いますか?Hibernate のドキュメントを検索しましたが、この "funny :@" 問題を解決できませんでした。

このコードは Toplink で実行されましたが、問題はありません。

どうもありがとうございました!!:)

4

1 に答える 1

5

これは、Hibernateでページングが行われる方法です-そのDialect実装を使用します。方言のAPIは次のとおりです。ページングされるSQLクエリと範囲情報を取得し、目的の行範囲を生成するSQLステートメントを生成します。

caseまたはOracleDialectの場合ROWNUM、元のクエリを使用でき、変更する必要はありません。たとえば、DB2やSQL Serverの場合、目的の範囲をフィルタリングできるように、方言でクエリを大幅に変更する必要があります(出力に列を追加することを含みますが、これに限定されません)。

そして最後に、最初のページまたは結果が異なる理由。SQLは(実装に応じて)のような構造を許可するため、範囲のSELECT TOP nクエリは多くの場合異なります。[0, n][m, n]

于 2012-01-31T00:32:59.453 に答える