2010-04-07 190 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();