Как вы обрисовали в общих чертах, с помощью DisplayTag вам нужно получить все результаты и поместить их в сеанс. Таким образом, вы делаете только один (потенциально дорогой) запрос, но он не будет хорошо масштабироваться с точки зрения памяти (если вам нужно получить большое количество результатов или если вы увеличите число одновременно работающих пользователей).
С другой стороны, в Hibernate вы можете использовать setFirstResult
и setMaxResult
, чтобы извлекать только записи, фактически показанные на каждой странице. Это требует выполнения запроса для каждой страницы, но масштабируется до бесконечного числа результатов.
Лично я предпочитаю второй подход, который я считаю более эффективным с точки зрения памяти - тем более что большинство пользователей не просматривают все страницы (так зачем загружать все результаты) - и использую шаблон, описанный в Разбиение на страницы в Hibernate и EJB3 .
Если вы решите придерживаться первого подхода, я бы применил некоторый предел максимального числа результатов, чтобы избежать слишком дорогих запросов. Если запрос выходит за пределы, попросите пользователя выполнить более строгий поиск, то есть добавить критерии (кто в любом случае собирается просматривать несколько тысяч результатов?).
И если вам нужны все результаты, например, для целей отчетности, то, на мой взгляд, ни DisplayTag, ни сеанс statefull не являются подходящим инструментом.