2009-10-13 9 views
24

क्या किसी को भी एक ही इकाई के कई घटनाओं को वापस करने के तरीकों को हाइबरनेट के Criteria.list() और Query.list() की वैधता के बारे में पता है?क्या यह डुप्लिकेट लौटने के लिए हाइबरनेट सूची() के लिए मान्य है?

कभी-कभी मुझे मानदंड एपीआई का उपयोग करते समय मिलता है, जो मेरी कक्षा मैपिंग परिभाषा ("चयन" से "जुड़ने" तक) में डिफ़ॉल्ट fetch रणनीति को बदलता है, कभी-कभी प्रभावित हो सकता है कि परिणामी आउटपुट में एक ही इकाई के कितने संदर्भ दिखाई दे सकते हैं list(), और मुझे यकीन है कि यह एक बग के रूप में इलाज करना है या नहीं। जावाडोक इसे परिभाषित नहीं करता है, यह बस "मिलान किए गए क्वेरी परिणामों की सूची" कहता है। (धन्यवाद दोस्तों)।

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

किसी को भी इसका कोई अनुभव मिला है?

उत्तर

20

हां, यदि आप अपने प्रश्नों का निर्माण करते हैं तो डुप्लिकेट प्राप्त करना पूरी तरह से संभव है ताकि यह हो सके। उदाहरण के लिए देखें Hibernate CollectionOfElements EAGER fetch duplicates elements

+6

+1। मैं अपने उत्तर से जुड़े किसी को कैसे उखाड़ नहीं सकता? :-) गंभीरता से, हालांकि - हां, हाइबरनेट डुप्लिकेट वापस कर सकता है जब एक से अधिक "टू-कई" एसोसिएशन को या तो उत्सुकता के साथ घोषित किया जाता है या उसी क्वेरी में शामिल होने का उपयोग करके पुनर्प्राप्त किया जाता है। 14.3 के निचले हिस्से में नोट देखें: http://docs.jboss.org/hibernate/stable/core/reference/en/html/queryhql.html#queryhql-joins – ChssPly76

+0

दस्तावेज़ लिंक के लिए धन्यवाद, मुझे पता था कि यह था वहां कहीं भी – skaffman

+0

@ ChssPly76 लिंक टूटा हुआ है! – Champ

4

यदि आपके पास कोई ऑब्जेक्ट है जिसमें उप ऑब्जेक्ट्स की एक सूची है, और आपके मानदंड एक साथ दो तालिकाओं में शामिल हो जाते हैं, तो आप संभावित रूप से मुख्य ऑब्जेक्ट के डुप्लिकेट प्राप्त कर सकते हैं।

यह सुनिश्चित करने का एक तरीका है कि आपको डुप्लीकेट नहीं मिलता है, एक DistinctRootEntityResultTransformer का उपयोग करना है। इसका मुख्य दोष यह है कि यदि आप परिणाम सेट बफरिंग/पंक्ति गणना का उपयोग कर रहे हैं। दोनों एक साथ काम नहीं करते हैं।

4

मैंने अपने जावा एपीआई में इस व्यवहार को भी देखना शुरू कर दिया क्योंकि यह बढ़ने लगा। खुशी है कि इसे रोकने के लिए एक आसान तरीका है। अभ्यास से मैंने संलग्न करना शुरू कर दिया है:

.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 

मेरी सभी मानदंडों को एक सूची लौटने के लिए। उदाहरण के लिए:

List<PaymentTypeAccountEntity> paymentTypeAccounts = criteria() 
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 
    .list(); 
संबंधित मुद्दे

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