setFirstResult и setMaxResults не работают должным образом

У меня проблема с пейджингом в моем приложении. Я хочу использовать методы setFirstResult и setMaxResults, но это дало мне неверный результат:

(Моя база данных: SQLite)

Пример:

    Session session = HibernateUtil.getSessionFactory().openSession();

    int page = 0;
    int maxRows = 20;

    while (page < 5) {

        Criteria criteria = session.createCriteria(Book.class);
        criteria.setFirstResult(page * maxRows).setMaxResults(maxRows);
        criteria.addOrder(Order.asc("id"));
        List<Book> list = criteria.list();

        System.out.println("FirstRow: " + page * maxRows + " - RowsLimit: " + maxRows);
        for (Book b : list) {
            System.out.println(b.getId());
        }
        page++;
    }
    session.close();

Результат дал мне:

FirstRow: 0 - RowsLimit: 20
1
.
.
.
20
FirstRow: 20 - RowsLimit: 20
21
.
.
.
40
FirstRow: 40 - RowsLimit: 20
21
.
.
.
40
FirstRow: 60 - RowsLimit: 20
21
.
.
.
40

Я понятия не имею, почему только первые две «страницы» работают правильно, а после них я получил тот же диапазон строк.

Спасибо за любой совет


person cz_Nesh    schedule 22.02.2013    source источник
comment
Знаете ли вы, как настроить Hibernate для вывода генерируемого SQL?   -  person Dave L.    schedule 22.02.2013
comment
Вы имеете в виду свойства show_sql, format_sql и use_sql_comments в hibernate.cfg.xml ??   -  person cz_Nesh    schedule 22.02.2013
comment
Да. Просто установите show_sql и format_sql на true.   -  person Dave L.    schedule 22.02.2013
comment
Интересно, что он напечатал только запрос подвыборки автора (он находится в отношении (автор) многие к одному (книга)) Hibernate: select this_.id as id0_0_, this_.firstName as firstName0_0_, this_.lastName as lastName0_0_ from Author this_ order by this_.id asc limit ? offset ? FirstRow: 20 - RowsLimit: 20   -  person cz_Nesh    schedule 22.02.2013
comment
Хорошо, может быть, есть другой способ сделать пейджинг. Что-то вроде прокрутки, но мне нужно поддерживать высокую производительность. Таблица имеет 15 000 строк. идеи?   -  person cz_Nesh    schedule 23.02.2013
comment
Нет, я думаю, что вы близки, но, возможно, что-то не так в вашей конфигурации классов Author и Book. Кроме того, show_sql заставляет распечатывать все sql - может быть, вы не видите весь журнал?   -  person Dave L.    schedule 23.02.2013
comment
Возможно, я нашел решение своей проблемы здесь: shagy0101.blogspot.cz /2012/03/ Я пришлю вам отзыв после тестирования.   -  person cz_Nesh    schedule 23.02.2013
comment
Спасибо, Дэвид. Решение, которое я нашел, ниже :)   -  person cz_Nesh    schedule 23.02.2013


Ответы (1)


Хорошо, вот решение.

http://shagy0101.blogspot.cz/2012/03/sqlite-jpa-hibernate-pagination.html

Проблема была в диалекте SQLite. Просто добавьте в свой SQLiteDialect этот метод:

 @Override
 public boolean bindLimitParametersInReverseOrder(){
     return true;
 }
person cz_Nesh    schedule 23.02.2013