2011-10-19 20 views
5

मेरे पास Order नामक एक डोमेन क्लास है और उस श्रेणी में वर्ग के साथ hasMany संबंध है। जब मैं कुछ प्रतिबंधों के साथ आदेशों की सूची के लिए पूछताछ कर रहा हूं तो मुझे Order के कई उदाहरण मिल रहे हैं क्योंकि items हैं।डुप्लिकेट उदाहरणों को पुनर्प्राप्त करने के लिए Grails मानदंड क्वेरी

इसलिए उदाहरण के लिए Order उदाहरण Item के 3 उदाहरण के लिए संदर्भ का कहना है कि उसके बाद, पर OrderOrder के 3 डुप्लिकेट उदाहरणों लौटने फोन मापदंड है। मुझे यकीन नहीं है लेकिन अगर यह उल्लेखनीय है कि डोमेन क्लास Order में fetchMode"eager" पर सेट है।

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

def clazz = "cust.Order" 
def criteria = clazz.createCriteria() 
     println("clazz == "+Order.list())// returning correct data i.e unique instance of order 
     def filter = { 
        // trimmed down all filtering criteria for debugging 
      }//close filter 
     List results = criteria.list(max:params?.max,offset:params?.offset,filter) 
      results.each{Object data-> 
       println(data.getClass()) 
      } 
     println("results == "+results) 

धन्यवाद फिर से

उत्तर

2

मानदंड एपीआई सिर्फ एक SQL क्वेरी निर्माण के लिए एक आवरण है। आपके मामले में, प्रश्न में पूछताछ में जॉइन है (उत्सुक fetching के कारण), और ऑर्डर और उनके मिलान आइटम के एक कार्टशियन उत्पाद देता है। प्रत्येक पंक्ति को वापस एक अलग ऑर्डर उदाहरण के रूप में परिणामों में शामिल किया गया है।

def resultSet = new HashSet() 
resultSet.addAll(results) 
println("results == " + resultSet) 
+0

यह काम किया लेकिन क्या इसे हल करने का कोई बेहतर तरीका है? क्वेरी या किसी भी चीज़ के दौरान fetch मोड बदलने की तरह? – Amit

3

आप कॉल criteria.listDistinctcriteria.list के स्थान पर डुप्लीकेट का सफाया हो जाएगा

+0

यह ध्यान दिया जाना चाहिए कि यह परिणाम परिणामों के प्रकार को डोमेन ऑब्जेक्ट्स की सूची में बदल सकता है (कुछ मामलों में पेजिनेशन तोड़ता है)। – bschipp

+1

आप सूची के साथ अधिकतम या ऑफ़सेट जैसे पैरा जोड़ नहीं सकते हैंडिस्टिंक (सूचीडिस्टिंक() विधि पेजिनेशन विकल्पों के साथ अच्छी तरह से काम नहीं करती है अधिकतम और पहले परिणाम। यदि आपको पेजिनेशन के साथ अलग-अलग परिणामों की आवश्यकता है, तो हम वर्तमान में अनुशंसा करते हैं कि आप एचक्यूएल का उपयोग करें), कम से कम grails में 2.x या नीचे – GSAN

0

तुम भी गतिशील इस्तेमाल कर सकते हैं, तो:

डुप्लिकेट निकालने के लिए सबसे आसान तरीका इस तरह, एक सेट में सभी परिणाम डाल करने के लिए है खोजकर्ता, जैसा कि ऑर्डर.फिंडएल्बी * में है। इस पर निर्भर करता है कि आपका फ़िल्टर कितना जटिल है, यह आसान या कठिन हो सकता है :)

+0

मेरा फ़िल्टर काफी जटिल और बहुत गतिशील है, मुझे नहीं लगता कि यह इस मामले में काम करेगा। फ़िल्टर नेस्टेड ऑब्जेक्ट्स पर भी लागू होता है। यही कारण है कि मैंने देशी एसक्यूएल पर मानदंडों का उपयोग करने का फैसला किया – Amit

3

एक समाधान आपकी क्वेरी के अंदर इसका उपयोग करना है:

resultTransformer org.hibernate.Criteria.DISTINCT_ROOT_ENTITY 
संबंधित मुद्दे