Существует ли способ получить размер количества для Именованного запроса JPA с набором результатов?

Мне нравится идея Именованных запросов в 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").

17
задан Tim 19 February 2010 в 16:29
поделиться

1 ответ

Использование setFirstResult / setMaxResults do not возвращает подмножество набора результатов, запрос даже не был запущен, когда вы вызываете эти методы, они влияют на сгенерированный запрос SELECT, который будет выполнен при вызове getResultList . Если вы хотите получить общее количество записей, вам нужно будет ВЫБРАТЬ СЧЕТ ваших сущностей в отдельном запросе (обычно перед разбивкой на страницы).

Полный пример см. В Разбиение на страницы наборов данных в примере приложения с использованием JSF, сеанса без сохранения состояния Catalog Facade и API сохраняемости Java .

5
ответ дан 30 November 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: