2010-04-07 141 views
6

我无法找出如何代表下列JPQL查询使用countDistinct:实施例在JPA标准API查询

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。

回答

11

试试这个,这是工作与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(); 
+0

Arghhh。我是新的,这是一个简单的错误。 – Tim 2010-04-17 14:21:03

5

这是一个很老的问题,但对于completness这里有一个简单的加法:

标题说了一些关于“使用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();