Пейджинг Native SQL Query в JPA с Hibernate без ошибок - PullRequest
2 голосов
/ 31 января 2012

Спасибо за ваше внимание, и извините за мой английский: S

Я использую 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

Короче говоря, вывод на первой странице имеет n элементов в строке (это мой желаемый вывод), но на второй и третьей страницах есть n + 1 элементов, а дополнительным элементом представляется номер строки, которая была доставлена.

У кого-то случилось то же самое?Я искал в документации Hibernate, но я не мог решить эту проблему "funny: @".

Этот код был выполнен с Toplink, и у него нет проблемы.

Большое спасибо!:)

1 Ответ

4 голосов
/ 31 января 2012

Это способ подкачки страниц в Hibernate - с использованием его Dialect реализаций. API для диалекта выглядит следующим образом: он принимает запрос SQL для разбивки на страницы и определения диапазона, а также создает оператор SQL, дающий желаемый диапазон строк.

В случае Oracle Dialect он может использовать ROWNUM и не нуждается в изменении исходного запроса. В случае, например, DB2 или SQL Server диалект должен существенно изменить ваш запрос (включая, но не ограничиваясь добавлением дополнительного столбца в выводе), чтобы иметь возможность отфильтровать желаемый диапазон для вас.

И последнее - почему ваша первая страница или результат отличаются. SQL допускает (в зависимости от реализации) такие конструкции, как SELECT TOP n, поэтому запрос для диапазона [0, n] и [m, n] часто отличается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...