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

StackOverflow https://stackoverflow.com/questions/1600215

Вопрос

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

Это было полезно?

Решение

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

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

Другие советы

Вы должны выполнить отдельный запрос, чтобы получить максимальные результаты ... и в случае, когда между временем 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;

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top