2010-10-05 13 views
8

मैं एक जेपीए अलग प्रक्षेपण का उपयोग कर रहा कुछ डेटा प्राप्त करने के लिए:क्या DISTINCT जेपीए प्रक्षेपण के साथ COUNT का उपयोग करना संभव है?

select distinct o.f1, o.f2, o.f3 from SomeEntity o where ... 

यह setFirstResult और पेज के आंकड़ों के setMaxResults साथ ठीक काम करता है।

हालांकि मुझे उन सभी को लाने के बिना पंक्तियों की कुल संख्या गिनने की आवश्यकता है। मैंने कोशिश की है:

select count(distinct o.f1, o.f2, o.f3) from SomeEntity o where ... 

यह (EclipseLink साथ वैसे भी) काम नहीं करता है और यह जेपीए कल्पना की अनुमति दी जानी प्रतीत नहीं होता है। क्या कोई और तरीका है? मैं ऐसा करने के लिए एक एसक्यूएल क्वेरी लिखना नहीं चाहता हूं।

+1

संभावित डुप्लिकेट [जेपीए मानदंड एपीआई में एक अलग गिनती कैसे करें?] (Http://stackoverflow.com/questions/6197591/how-to-do-a-distinct-count-in-jpa-critera- एपीआई) – Arun

उत्तर

-2

आप कहते हैं कि आप ऐसा करने के लिए एक SQL क्वेरी लिखना नहीं चाहते हैं, लेकिन जेपीए क्यूएल और एसक्यूएल के बीच क्या अंतर है? यदि आप कुल पंक्तियों की संख्या निर्धारित करने के लिए getResultList().size() विधि का उपयोग नहीं करना चाहते हैं, तो मूल एसक्यूएल क्वेरी का उपयोग करने का एकमात्र तरीका है।

entityManager.createNativeQuery("select count(distinct o.f1, o.f2, o.f3) from SomeEntity o where ...").getSingleResult(); 

या

entityManager.createQuery("select distinct o.f1, o.f2, o.f3 from SomeEntity o where ...").getResultList().size(); 
+0

जहां क्लॉज काफी जटिल है और बहुत सारे एसक्यूएल उत्पन्न करता है। मैं खुद को बनाए रखना नहीं चाहता हूं। इसके अलावा मेरे पास एक ही प्रश्न के दो संस्करण होंगे, एक गणना के लिए एसक्यूएल में और एक ईजेबीक्यूएल पंक्तियों का एक पृष्ठ लाने के लिए होगा। –

+0

एक कारण है कि जेपीक्यूएल क्यों मौजूद है और इसका मूल रूप से देशी एसक्यूएल पर क्यों अनुशंसा की जाती है। GetResultList() आकार() का उपयोग करना यदि आप केवल आइटमों की संख्या पुनर्प्राप्त करना चाहते हैं तो वह अप्रभावी और बेकार है। –

0

इस प्रयास करें:

select count(distinct o) from SomeEntity o where ... 
+1

डाउनवॉट्स क्यों? यह मेरे लिए पूरी तरह से काम किया –

0

तो EclipseLink और अपने अंतर्निहित डीबी अनुमति देते हैं subselects कोशिश:

select count(*) from (select distinct o.f1, o.f2, o.f3 from SomeEntity o where ...) 

उस स्थिति में आपके बस अपने JQL डाल सकते हैं अपने कुल परिणाम आकार की गणना करने के लिए।

यह प्रश्नों के नाम से हाइबरनेट एसक्यूएल के लिए काम करता है। मैं जल्द ही जेपी-क्यूएल प्रश्नों पर कोशिश करूंगा।

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