Пример использования countDistinct в запросе API JPA Criteria - PullRequest
6 голосов
/ 07 апреля 2010

У меня проблемы с выяснением, как представить следующий запрос JPQL:

SELECT count(e) FROM Foo e

с использованием API Criteria.Я пытаюсь:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Foo> c = cb.createQuery(Foo.class);
Root<Foo> f = c.from(Foo.class);
c.select(cb.count(f));

, но это не работает.Я также попробовал:

c.select(cb.count(f.get("id"));

Это для JPA2, Eclipselink.

Ответы [ 2 ]

11 голосов
/ 16 апреля 2010

попробуйте, это работает с Hibernate 3.5.1:

CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Long> c = cb.createQuery(Long.class);
Root<Foo> f = c.from(Foo.class);
c.select(cb.count(f));
int count = em.createQuery(c).getSingleResult().intValue();
5 голосов
/ 28 февраля 2012

Это довольно старый вопрос, но для полноты вот простое дополнение:

В заголовке сказано что-то об «использовании countDistinct», поэтому countDistinct следует упомянуть здесь:

CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
Root<Foo> root = critQuery.from(Foo.class);

critQuery.select(critBuilder.countDistinct(root));
int count = entityManager.createQuery(critQuery).getSingleResult().intValue();

Это важно, если вы не хотите считать двойные строки. Если вы хотите избежать двойных строк в вашем ResultList, вам придется использовать:

CriteriaBuilder critBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<Long> critQuery = criteriaBuilder.createQuery(Long.class);
Root<Foo> root = critQuery.from(Foo.class);

critQuery.select(root).distinct(true);
List<Foo> result = entityManager.createQuery(critQuery).getResultList();
...