2013-08-16 7 views
11

मैं एक मानदंड है कि सभी डेटा आवेदन की आवश्यकता है देता है, मूल रूप से:हाइबरनेट मानदंड: अलग संस्थाओं और उसके बाद की सीमा

Criteria criteria = session.createCriteria(Client.class); 
criteria.createAlias("address", "address"); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
criteria.setFirstResult(init); 
criteria.setMaxResults(max); 
List<Client> clients = criteria.list(); 

समस्या संबंध ग्राहक/पता द्विदिश है: ग्राहक एक पता होता है पर और एक पता एक से अधिक ग्राहक से संबंधित हो सकता है।

मैं अपने पीके पाठ्यक्रम के आधार पर "सिंगल" क्लाइंट ऑब्जेक्ट्स को पुनर्प्राप्त करना चाहता हूं, कुछ क्लाइंट्स जैसे कि वे किसी तालिका में प्रदर्शित होते हैं।

क्योंकि सेट फर्स्ट रीसेट/सेटमैक्स रीसेट्स पहले निष्पादित किए जाते हैं, मुझे पहले से लागू सीमाओं के भीतर डुप्लीकेट क्लाइंट मिल रहे हैं। उसके बाद (आवेदन के स्तर के रूप में आवेदन स्तर का उपयोग नहीं किया गया था) हाइबरनेट को डुप्लिकेट क्लाइंट की छाप मिलती है, इसलिए मैं कम क्लाइंट्स के साथ समाप्त होता हूं जो सेटमैक्स रेसल्ट्स में अधिकतम निर्दिष्ट होते हैं।

(प्रक्षेपण समूह) द्वारा समूहित नहीं किया जा सकता है क्योंकि यह ग्राहक/पते में आवश्यक सभी कॉलम वापस नहीं करेगा, केवल उस समूह का समूह समूह द्वारा समूहबद्ध किया जा रहा है।

(समेकित करने के लिए, मेरी तालिका में प्रति पृष्ठ 100 परिणाम हैं लेकिन डुप्लिकेट को छोड़ने के बाद मेरे पास 100 के बजाय 98 परिणाम हैं ...) ऐसा इसलिए है क्योंकि सीमा: LIMIT 0,100 लागू होती है जब इसे बाद में किया जाना चाहिए)

उत्तर

7

के रूप में यह धागा "आशीष ठुकराल" अगली पंक्ति से जुड़े हुए में बताया जाता है इस को हल करती है:

criteria.setFetchMode("address.clients", FetchMode.SELECT); 

यह में शामिल होने कि समस्या किए जाने के लिए कारण बनता है रोकता है।

बेशक, एक्सएमएल कॉन्फ़िगरेशन फ़ाइल से fetch = "join" को निकालना संभव है लेकिन यह समाधान अन्य स्थानों को प्रभावित नहीं करता है जहां सेम को पुनर्प्राप्त किया जा सकता है।

+0

FetchMode.SELECT ने इसे मेरे लिए तय किया - अन्य मोड इस मामले में काम नहीं करते हैं। –

+0

FetchMode.SELECT बहुत अच्छा है ... सिवाय इसके कि यह कुछ कारणों से, एक उत्सुक लाने के लिए मजबूर करता है। Https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/FetchMode.html देखें कि इकाई के पीके पर "विशिष्ट" करने के लिए बस हाइबरनेट को बताने का कोई तरीका नहीं है ?? यह सबसे स्पष्ट चीज की तरह दिखने के लिए सबसे छोटी चीज की तरह लगता है, और, सामान्य रूप से, हाइबरनेट जीवन को हमारे लिए बेहद जटिल बनाता है। – Marc

+0

वैसे, एचक्यूएल के साथ ऐसा करना उतना ही छोटा है जितना लगता है। आप बस अपनी क्वेरी में "विशिष्ट" शब्द जोड़ते हैं। मानदंड एपीआई का उपयोग करके यह इतना दर्दनाक रूप से कठिन क्यों है मेरे बाहर है। क्या हम सभी अभी तक ओओ डेटाबेस का उपयोग करना शुरू कर सकते हैं? – Marc

4

यदि आप निम्नानुसार आईडी के आधार पर ग्राहक की तलाश में हैं। आपके मानदंडों के आधार पर अधिकतम और init आकार की आवश्यकता नहीं है क्योंकि यह हमेशा एक ग्राहक को वापस कर देता है।

Criteria criteria = getSession().createCriteria(Client.class); 
criteria .add(Restrictions.eq("id", yourClientId); 
criteria.createAlias("address", "address"); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
criteria.setFirstResult(init); 
criteria.setMaxResults(max); 
List<Client> clients = criteria.list(); 

यदि आप निम्नानुसार आईडी के आधार पर पता ढूंढ रहे हैं।

Criteria criteria = getSession().createCriteria(Client.class); 
criteria.createAlias("address", "address"); 
criteria .add(Restrictions.eq("address.id", yourAddressId); 
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 
criteria.setFirstResult(init); 
criteria.setMaxResults(max); 
List<Client> clients = criteria.list(); 
+3

आपके उत्तर के लिए बहुत बहुत धन्यवाद, लेकिन मैं सभी ग्राहकों की तलाश कर रहा था, उन्हें पृष्ठों में प्रतिक्रिया के रूप में लौट रहा था। समस्या उस पृष्ठ से है जो 100 परिणाम वापस करनी चाहिए, उन्हें समूहित करने के बाद कम लौटाती है (DISTINCT_ROOT_ENTITY)। उस समूह को सीमा से पहले खुश होना चाहिए ... – kandan

+0

दूसरे ब्लॉक के परिणामस्वरूप @kandan द्वारा उनके प्रश्न –

0

यदि मैं आपके संबंधों को सही ढंग से समझता हूं, तो आपके पास प्रत्येक ग्राहक इकाई वर्ग में पता और एक पते में ग्राहक की एक सूची होगी। तो अगर आप सिर्फ ग्राहक की एक सूची चाहते हैं, बड़ी बात क्या है, नहीं तो आप सिर्फ उनके द्वारा

Criteria criteria = session.createCriteria(Client.class); 
criteria.setFirstResult(init); 
criteria.setMaxResults(max); 
List<Client> clients = criteria.list(); 

आप ऐसा उपनाम क्यों पैदा करने और distinct_root_entity उपयोग कर रहे हैं मिल सकता है? यदि आपको वह पता प्राप्त करने की आवश्यकता है, जब आप इसे अपने डीएओ या सर्विसइम्प्ल में एक्सेस करते हैं, तो हाइबरनेट किसी भी तरह से आपके लिए आलसी हो जाएगा।

अगर मैं गलत हूं तो मुझे सुधारें।

+0

पर पोस्ट की गई पंक्तियों की कम संख्या में परिणाम हो सकता है। मैं हाइबरनेट को क्वेरी में अन्य डेटा प्राप्त करने के लिए मजबूर करने के लिए एक उपनाम बना रहा हूं क्योंकि मैं क्लाइंट को फ़िल्टर कर सकता हूं उदाहरण के लिए उनके पोस्टकोड (फ़िल्टर के साथ एक पृष्ठांकित तालिका है)। इसलिए मुझे आवश्यक सभी डेटा मिलते हैं: पते वाले ग्राहक।समस्या यह है कि पते के साथ उन ग्राहकों का एक समूह भी आता है जिनके पास पता है और मुझे अपने आईडी द्वारा ग्राहकों को एकजुट करने के लिए परिणाम ट्रांसफॉर्मर की आवश्यकता है। शायद यह संभव है, किसी भी एनोटेशन को संशोधित किए बिना, हाइबरनेट को क्लास/टेबल के लिए किसी विशिष्ट कॉलम को पुनर्प्राप्त/शामिल न करने के लिए कहें, लेकिन अन्य फ़ील्ड में ऐसा करें, जो डिफ़ॉल्ट परिभाषित (आलसी या नहीं) निर्दिष्ट है। – kandan

+1

मुझे लगता है कि आप इस http://stackoverflow.com/questions/5567754/hibernate-criteria-n1-issue-with-maxresults?rq=1 –

+0

हां, इसके लिए धन्यवाद। – kandan

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