Реализация подкачки результатов в hibernate (получение общего количества строк)
как реализовать подкачку в спящем режиме? The Query
объекты и методы, называемые setMaxResults
и setFirstResult
которые, безусловно, полезны. Но где я могу получить общее количество результатов, чтобы я мог показать ссылку на последнюю страницу результатов и напечатать такие вещи, как результаты 200 до 250 из xxx?
5 ответов
вы можете использовать запрос.setMaxResults (результаты int) и запрос.setFirstResult (смещение int).
редактирование тоже: нет никакого способа знать, сколько результатов вы получите. Итак, сначала вы должны запросить "select count (*)...". Немного некрасиво, ИМХО.
вы должны сделать отдельный запрос, чтобы получить максимальные результаты...и в случае, когда между временем 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;
вы можете выполнить два запроса-Запрос типа count (*), который должен быть дешевым, если вы не объединяете слишком много таблиц вместе, и второй запрос с установленными ограничениями. Тогда вы знаете, сколько элементов существует, но только захватить те, которые просматриваются.
вы можете просто setMaxResults максимальное количество строк, которые вы хотите вернуть. Нет никакого вреда в значение больше, чем количество фактических строк. Проблема другого решения они предполагают упорядочение записей остается прежним каждом повторении запроса, и нет изменений происходит между командами.
чтобы избежать этого, если вы действительно хотите прокручивать результаты, лучше всего использовать ScrollableResults. Не выбрасывайте этот предмет подкачки, но использовать его, чтобы сохранить записи в том же порядке. Чтобы узнать количество записей из ScrollableResults, вы можете просто перейти к последней позиции (), а затем получить номер строки. Не забудьте добавить 1 к этому значению, так как номера строк начать отсчет с 0.
Я лично думаю, что вы должны обрабатывать пейджинг в интерфейсе. Я знаю, что это не так эффективно, но, по крайней мере, это будет менее подвержено ошибкам.
Если бы вы использовали count (*), что произойдет, если записи будут удалены из таблицы между запросами на определенную страницу? Многое может пойти не так.