2012-12-21 11 views
10

मैं "समूह द्वारा" का उपयोग करके एक मानदंड क्वेरी लिखना चाहता हूं और सभी कॉलम वापस करना चाहता हूं।हाइबरनेट मानदंडों में "समूह द्वारा" के साथ "सभी कॉलम" का चयन करें

विमान एसक्यूएल इस तरह है:

select * from Tab group by client_name order by creation_time; 

मैं समझता हूँ कि यह पंक्तियों की count(distinct client_name) नंबर होगा।

मेरे वर्तमान क्वेरी जो उचित परिणाम देने के लिए प्रतीत नहीं होता है इस प्रकार है:

Criteria criteria = getSession(requestType).createCriteria(Tab.class); 
     criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("client_name"))); 
     criteria.addOrder(Order.asc("creationTime")); 

इस क्वेरी "client_name" रिटर्न केवल। मैं मैन्युअल रूप से सभी कॉलम नाम नहीं रखना चाहता हूं। कुछ रास्ता होना चाहिए, क्या किया जा सकता है?

+0

इस लिंक को देखें: http://stackoverflow.com/questions/6678216/hibernate-select-all-projections-group-by – maximilianus

उत्तर

1

मुझे लगता है कि आप कुछ गलत समझ रहे हैं। यदि आप SQL में GROUP BY हैं, तो आपको सभी चयनित कॉलमों द्वारा समूहित करने की आवश्यकता है। यह Hibernate पर लागू होता है - यदि आप groupPropertyProjection में लागू करते हैं, तो आप हाइबरनेट को बता रहे हैं कि वह कॉलम समूह कॉलम है। यदि कोई अन्य कॉलम/फ़ील्ड संदर्भित नहीं हैं, तो हाइबरनेट मान लेगा कि आप उन्हें नहीं चाहते हैं, क्योंकि उन्हें समूहबद्ध करने की भी आवश्यकता होगी।

एक कदम वापस लेने के लिए: आप क्या करने की कोशिश कर रहे हैं? यदि आपके पास तालिका में सभी स्तंभों में डुप्लिकेट डेटा है, तो आपके पास खराब डेटा हो सकता है, या गलत डेटा हो सकता है। कम से कम, आपकी कुंजी गड़बड़ हो जाएगी।

0

अनुमानों के लिए हाइबरनेट में, आवश्यक सभी स्तंभों को प्रक्षेपण सूची में जोड़ा जाना आवश्यक है। परिणाम में परिणाम प्राप्त करने के लिए हमें setResultTransformer का उपयोग करना होगा। उदाहरण के नीचे की जाँच करें हाइबरनेट में से समूह पाने के लिए:

ProjectionList projectionList = Projections.projectionList(); 
    projectionList.add(Projections.groupProperty("column1")); 
    projectionList.add(Projections.property("column2")); 
    projectionList.add(Projections.property("column3")); 
    criteria.setProjection(projectionList); 
    criteria.setResultTransformer(Transformers.aliasToBean(Table.class)); 
0

जब हाइबरनेट प्रक्षेपण का उपयोग कर आप सभी स्तंभों जो प्रक्षेपण सूची में की जरूरत है जोड़ना चाहिए। आपने केवल Projections.projectionList() का उपयोग किया है। (प्रोजेक्शन.groupProperty ("client_name"))

यह। इसलिए यह स्पष्ट है कि केवल क्लाइंट_नाम लौटाएं।

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