2010-02-04 8 views
17

मैं वास्तव में परिणामों की सूची प्राप्त किए बिना गतिशील रूप से जेनरेट की गई एचक्यूएल क्वेरी के परिणामों की गिनती प्राप्त करना चाहता हूं। का कहना है कि क्वेरी मेरे पास है कुछ की तरह:हाइबरनेट एचक्यूएल: वास्तव में उन्हें वापस लौटने के बिना परिणामों की गिनती प्राप्त करें

select Company company LEFT OUTER JOIN FETCH products product 

मैं हाइबरनेट दस्तावेज में पढ़ा है कि:

आप उन्हें लौटने के बिना क्वेरी परिणामों की संख्या की गणना कर सकते हैं:

((Integer) session.createQuery("select count(*) from ....").iterate().next()).intValue() 

मुझे संदेह है कि मुझे को बदलना चाहिए .... मेरी क्वेरी के साथ, लेकिन यह काम नहीं करता है, क्योंकि एचक्यूएल supp नहीं है ओआरटी से उप-चयन करता है।

तो, मुझे गतिशील रूप से जेनरेट की गई एचक्यूएल क्वेरी के परिणामों की गणना कैसे करनी चाहिए? मुझे लगता है कि इसे निष्पादित करके और परिणाम सूची का .size() प्राप्त करना अनावश्यक ओवरहेड हो सकता है।

चीयर्स!

** अद्यतन: **

मैं अपने जिज्ञासा को बदलने को यह regex प्रयोग किया है:

Number num = (Number) em.createQuery(dynamicQuery.replaceAll("select \\w+ from ", "select count(*) from ")).getSingleResult(); 

और मैं इस मिल:

Blockquote

EJB अपवाद:; नेस्टेड अपवाद है: java.lang.IllegalArgumentException: org.hibernate.QueryException: क्वेरी में शामिल होने में निर्दिष्ट क्वेरी शामिल है, लेकिन प्राप्त किए गए एसोसिएशन का मालिक चुनिंदा सूची में मौजूद नहीं था [सेलेमेंट {स्पष्ट, संग्रह में शामिल नहीं होना, शामिल होना, गैर- -lazy गुण, classAlias ​​= उत्पाद, भूमिका = org.myCompany.applicant.entity.Aplplantant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, मूल = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org। myCompany.product.entity.Product}}] [org.myCompany.applicant.entity से गिनती () का चयन करें। आवेदनकर्ता आवेदक बाएं बाहरी जॉइन फ़ेच आवेदक.प्रॉडक्ट्स उत्पाद]; नेस्टेड अपवाद है: java.lang.IllegalArgumentException: org.hibernate.QueryException: क्वेरी में शामिल होने में निर्दिष्ट क्वेरी शामिल है, लेकिन प्राप्त किए गए एसोसिएशन का मालिक चुनिंदा सूची में मौजूद नहीं था [सेलेमेंट {स्पष्ट, संग्रह में शामिल नहीं होना, शामिल होना, गैर- -lazy गुण, classAlias ​​= उत्पाद, भूमिका = org.myCompany.applicant.entity.Aplplantant.products, tableName = PRS_DEV.PRODUCT, tableAlias ​​= products1_, मूल = PRS_DEV.APPLICANT applicant0_, colums = {applicant0_.APPLICANT_ID, className = org। org.myCompany.applicant.entity.Applicant आवेदक वाम बाहरी से myCompany.product.entity.Product}}] [चयन गणना () शामिल हों applicant.products उत्पाद]

उत्तर

14

FETCH इस चाल करना चाहिए:

select count(*) FROM Company c JOIN ... 

कोई उप-चयन शामिल नहीं है, बस Company लौटने के बजाय, आप गिनती वापस कर देते हैं।

संपादित करें:FETCH अब जगह से बाहर है। आप क्वेरी से इकाइयों को वापस नहीं कर रहे हैं, लेकिन केवल गिनती, इस प्रकार, हाइबरनेट शिकायत करता है।निकाला जा रहा है यह मदद करनी चाहिए:

select count(product) from org.myCompany.applicant.entity.Applicant applicant 
    LEFT OUTER JOIN applicant.products product 
+0

हाँ, मुझे लगता है कि कोशिश की है। मुझे एक अपवाद मिलता है: क्वेरी अपवाद: क्वेरी में शामिल होने में निर्दिष्ट क्वेरी, लेकिन प्राप्त सूची में मालिक चयनित सूची में मौजूद नहीं था। पूर्ण स्टैक ट्रेस –

+0

@ मार्कोस के लिए मेरा अपडेट देखें: मैंने अपना जवाब अपडेट कर दिया है। – Henning

+0

धन्यवाद आदमी, यह काम किया! –

12

आप का उपयोग करके क्वेरी परिणाम की संख्या प्राप्त कर सकते हैं:

criteria.setProjection(Projections.rowCount()); 
count=(Long) criteria.uniqueResult(); 

आशा है कि यह मदद करता है

+4

यह मदद नहीं करता है। RowCount() विधि मानदंड API से संबंधित है, लेकिन ओपी एचक्यूएल का उपयोग कर रहा है। – jjmontes

+5

मैंने 'गिनती' के लिए मानदंड एपीआई की खोज की और यह संकेत मेरे लिए उपयोगी था। –