2010-04-07 15 views
6

मैं मुसीबत पता लगाना निम्नलिखित JPQL क्वेरी का प्रतिनिधित्व करने के लिए कैसे हो रही है में countDistinct का उपयोग कर:उदाहरण एक जेपीए मानदंड API क्वेरी

SELECT count(e) FROM Foo e 

मानदंड एपीआई का उपयोग कर। मैं जो कोशिश कर रहा हूं वह है:

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")); 

यह जेपीए 2, एक्लेप्सेलिंक के लिए है।

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(); 

उत्तर

11

इस कोशिश, इस हाइबरनेट 3.5.1 के साथ काम कर रहा है , इसलिए 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(); 

यह महत्वपूर्ण है कि आप पंक्तियों को डबल कर रहे हैं गिनती करने के लिए नहीं करना चाहते हैं।

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(); 
+0

Arghhh: आप अपने ResultList में doule पंक्तियों से बचना चाहते हैं, तो आप का इस्तेमाल किया था चाहते हैं। मैं नया यह एक साधारण गलती थी। – Tim

5

यह एक बहुत पुराना सवाल है, लेकिन completness के लिए यहाँ एक सरल इसके अलावा बताया गया है::

शीर्षक "countDistinct का उपयोग कर" के बारे में कुछ कहा

संबंधित मुद्दे