6

我无法弄清楚如何表示以下 JPQL 查询:

SELECT count(e) FROM Foo e

使用标准 API。我正在尝试的是:

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。

4

2 回答 2

11

试试这个,这适用于休眠 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();
于 2010-04-16T11:04:25.443 回答
5

这是一个相当古老的问题,但为了完整起见,这里有一个简单的补充:

标题说的是“使用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();
于 2012-02-28T14:56:45.327 回答