Мне нравится идея Именованных запросов в JPA для статических запросов, которые я собираюсь сделать, но я часто хочу получить результат подсчета для запроса, а также списка результата от некоторого подмножества запроса. Я не записал бы два почти идентичных NamedQueries. Идеально, то, что я хотел бы иметь, является чем-то как:
@NamedQuery(name = "getAccounts", query = "SELECT a FROM Account")
.
.
Query q = em.createNamedQuery("getAccounts");
List r = q.setFirstResult(s).setMaxResults(m).getResultList();
int count = q.getCount();
Таким образом, скажем, m равняется 10, s 0 и в Учетной записи существует 400 строк. Я ожидал бы, что r будет иметь список 10 объектов в нем, но я захочу знать, что существует 400 общих количеств строк. Я мог записать второй @NamedQuery:
@NamedQuery(name = "getAccountCount", query = "SELECT COUNT(a) FROM Account")
но это кажется нарушением DRY, чтобы сделать это, если я всегда просто собираюсь хотеть количество. В этом простом случае легко сохранить два в синхронизации, но если запрос изменяется, это кажется меньше, чем идеал, что я должен обновить обоих @NamedQueries для контролирования значений.
Случай общего использования здесь выбрал бы некоторое подмножество объектов, но нуждался бы в некотором способе указать на общее количество ("Отображающий 1-10 из 400").
Использование setFirstResult
/ setMaxResults
do not возвращает подмножество набора результатов, запрос даже не был запущен, когда вы вызываете эти методы, они влияют на сгенерированный запрос SELECT, который будет выполнен при вызове getResultList
. Если вы хотите получить общее количество записей, вам нужно будет ВЫБРАТЬ СЧЕТ
ваших сущностей в отдельном запросе (обычно перед разбивкой на страницы).
Полный пример см. В Разбиение на страницы наборов данных в примере приложения с использованием JSF, сеанса без сохранения состояния Catalog Facade и API сохраняемости Java .