2009-10-21 2 views
8

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

+1

Я согласен с двумя другими ответами. Кроме того, я прошу о практике внедрения в этой должности: http://stackoverflow.com/questions/1600440/java-coding-best-practices-for-reusing-part-of-a-query-to-count – KLE

ответ

12

Вы можете использовать Query.setMaxResults (int results) и Query.setFirstResult (int offset).

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

1

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

-2

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

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

+0

I не думайте, что это важно. Если записи удаляются ** и ** вы можете просматривать последние страницы, тогда вы получите сообщение об ошибке и ссылку на последние существующие записи. Или что-то подобное. – flybywire

+3

есть проблемы с пейджингом на лицевой стороне, если количество данных является чрезмерно большим - скажем, 1 миллион записей или что-то еще. – Chii

7

Вы должны сделать отдельный запрос, чтобы получить максимальные результаты ... и в случае, когда между моментами A в первый раз клиент выдает запрос подкачки к времени B, когда выдается другой запрос, если новые записи добавлены или некоторые записи теперь соответствуют критериям, тогда вам нужно снова запросить max, чтобы отразить их. Я обычно делаю это в 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; 
0

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

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

Смежные вопросы