2013-05-21 2 views
0

Я столкнулся с проблемой в разбивке на страницы. Я использую критерии. Длина отображения - 10. При нажатии на разбиение на страницы отображаются разные результаты, например, список 9 и 8. Как избежать таких проблем с разбивкой по страницам. Мне нужен список 10 каждый раз. Как контролировать этот вид несогласованности.Разбиение страницы с помощью гибернационных критериев

+0

Пожалуйста, разместите код, который вызывает проблему. –

+0

Почему бы вам не использовать сеансы для хранения? –

ответ

3

Пользователь setFirstResult() и setMaxResults() для этого. Вот короткий пример кода:

EntityManager em = ..... 
.................... 
TypedQuery<T> query = em.createQuery(criteria); 
query.setFirstResult(pageNumber * pageSize); 
query.setMaxResults(pageSize); 
3

Если вы используете firstResult и maxResults то, что означает, что результирующий набор потенциально очень большой, и вы хотите повторно выполнить запрос для каждой страницы. Если это так, то данные могут меняться между запросами, что приводит к несогласованным результатам. Единственный способ попытаться контролировать это - это отсортировать по некоторому уникальному значению или группе значений (первичный ключ или уникальный индекс) и добавить ограничение на запрос критериев, требующий, чтобы результаты имели значения или группы значений, превышающие последний результат на предыдущей странице. Даже тогда вставки, обновления и удаления между страницами все равно будут приводить к несоответствиям в результатах.

Если максимальное количество результатов является чем-то разумным (скажем, 500-1000 результатов), то может быть проще просто вывести все соответствующие результаты, кешировать их в памяти и обрабатывать пейджинг в слое пользовательского интерфейса, чтобы обеспечить согласованность. Общая стратегия состоит в том, чтобы ограничить запрос до некоторого разумного количества результатов (например, 1000) и установить максимальные значения для этого плюс 1 (например, 1001). Если количество возвращаемых результатов больше, чем ваш произвольный предел (то есть 1001 вице-1000), тогда отобразите пользователю указание, что было найдено более 1000 результатов, и запрос должен быть более конкретным (или пригласить их для получения следующих 1000 результатов).

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