Реализация подкачки результатов в спящем режиме (получение общего количества строк) - PullRequest
10 голосов
/ 21 октября 2009

Как мне реализовать пейджинг в Hibernate? У объектов Query есть методы, называемые setMaxResults и setFirstResult, которые, безусловно, полезны. Но где я могу получить общее количество результатов, чтобы я мог показать ссылку на последнюю страницу результатов и напечатать такие вещи, как результаты 200-250 из xxx ?

Ответы [ 5 ]

14 голосов
/ 21 октября 2009

Вы можете использовать Query.setMaxResults (целые результаты) и Query.setFirstResult (целое смещение).

Редактирование тоже: нет никакого способа узнать, сколько результатов вы получите. Итак, сначала вы должны сделать запрос с помощью «select count (*) ...». Немного некрасиво, ИМХО.

8 голосов
/ 21 октября 2009

Вы должны выполнить отдельный запрос, чтобы получить максимальные результаты ... и в случае, когда между временем A первого раза клиент отправляет запрос поискового вызова ко времени B, когда выдается другой запрос, если добавляются новые записи или некоторые записи теперь соответствуют критериям, тогда вам нужно снова запросить максимум, чтобы отразить такие. Я обычно делаю это на HQL, как это

Integer count = (Integer) session.createQuery("select count(*) from ....").uniqueResult();

для Criteria запросов Я обычно помещаю свои данные в DTO, как это

ScrollableResults scrollable = criteria.scroll(ScrollMode.SCROLL_INSENSITIVE);
if(scrollable.last()){//returns true if there is a resultset
    genericDTO.setTotalCount(scrollable.getRowNumber() + 1);
    criteria.setFirstResult(command.getStart())
            .setMaxResults(command.getLimit());
    genericDTO.setLineItems(Collections.unmodifiableList(criteria.list()));
}
scrollable.close();
return genericDTO;
2 голосов
/ 21 октября 2009

вы можете выполнить два запроса - запрос типа count (*), который должен быть дешев, если вы не объединяете слишком много таблиц, и второй запрос, для которого установлены ограничения. Тогда вы знаете, сколько существует предметов, но захватите только те, которые просматриваются.

0 голосов
/ 12 марта 2013

Вы можете просто установить MaxResults на максимальное количество строк, которые вы хотите вернуть. Нет никакого вреда в установке этого значения больше, чем количество доступных строк. Проблема других решений заключается в том, что они предполагают, что порядок записей остается неизменным при каждом повторении запроса, и между командами не происходит никаких изменений.

Чтобы избежать этого, если вы действительно хотите прокручивать результаты, лучше всего использовать ScrollableResults. Не выбрасывайте этот объект между страницами, но используйте его, чтобы сохранить записи в том же порядке. Чтобы узнать количество записей из ScrollableResults, вы можете просто перейти к позиции last (), а затем получить номер строки. Не забудьте добавить 1 к этому значению, так как номера строк начинают отсчитываться с 0.

0 голосов
/ 21 октября 2009

Лично я думаю, что вы должны обрабатывать пейджинг в интерфейсе. Я знаю, что это не так эффективно, но, по крайней мере, это будет менее подвержено ошибкам.

Если вы используете функцию count (*), что произойдет, если записи будут удалены из таблицы между запросами на определенную страницу? Многие вещи могут пойти не так, как надо.

...