Мне нравится идея именованных запросов в 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 и в Account 400 строк. Я бы ожидал, что r будет иметь список из 10 элементов, но я хотел бы знать, что всего 400 строк. Я мог бы написать второй @NamedQuery:
@NamedQuery(name = "getAccountCount", query = "SELECT COUNT(a) FROM Account")
но это кажется СУХИМ нарушением, если я всегда просто хочу подсчитать. В этом простом случае легко синхронизировать их, но если запрос изменится, кажется менее идеальным, что мне нужно обновить оба @NamedQueries, чтобы значения соответствовали друг другу.
Обычным вариантом использования здесь будет получение некоторого подмножества элементов, но при этом потребуется какой-либо способ указать общее количество («Отображение 1-10 из 400»).