2013-10-25 11 views
6
criteria = createCriteria("employee"); 
criteria.add(Restrictions.eq("name", "John")); 
criteria.addOrder(Order.asc("city")); 
criteria.addOrder(Order.asc("state")); 
List result = criteria.list(); 

के साथ सूची के बजाय एक सेट लौटाएं यह कथन Employee ऑब्जेक्ट्स की एक सूची देता है। डुप्लिकेट डेटा को हटाने के लिए, मैं इसके बजाय कर्मचारी ऑब्जेक्ट्स के Set को कैसे वापस कर सकता हूं?हाइबरनेट मानदंड

मुझे समझ में आता है कि मैं नीचे लौटाई गई सूची से एक सेट बनाकर इसे प्राप्त कर सकता हूं, लेकिन फिर मैं सूची के क्रमबद्ध क्रम को खो दूंगा। और मैं सेट को सॉर्ट करने के लिए कोड लिखना नहीं चाहता हूं।

Set<Employee> empSet = new HashSet<Employee>(result); 
+3

क्या आपने 'LinkedHashSet' का उपयोग करने का प्रयास किया है? यह आदेश को संरक्षित रखेगा, मुझे लगता है। – yamafontes

+2

शायद इससे मदद मिलनी चाहिए: [कैन-हाइबरनेट-रिटर्न-ए-कलेक्शन-ऑफ-ऑब्जेक्ट-ऑब्जेक्ट्स-ए-लिस्ट-ए-लिस्ट] (http://stackoverflow.com/questions/416970/can-hibernate-return- एक-संग्रह-परिणाम-ऑब्जेक्ट्स-अन्य-से-सूची) – baltov

+0

क्या आप इसे ढूंढ रहे हैं? http://stackoverflow.com/questions/10731723/how-to-add-distinct-in-hibernate-criteria – Taylor

उत्तर

2

टिप्पणी के रूप में और javadoc सुझाव है, तो आप Criteria से एक List वापस लौटाना होगा। इसलिए, तथ्य के बाद यूनिक्स को हटाना आपका एकमात्र विकल्प है। केपानीहोल ने कहा, यदि आप आदेश को संरक्षित करना चाहते हैं तो आपको LinkedHashSet का उपयोग करना चाहिए।

7

मुझे नहीं लगता कि को Criteria का उपयोग जावडोक के आधार पर वापस करना संभव है। हालांकि, यदि आप डुप्लिकेट डेटा को हटाना चाहते हैं, तो डुप्लिकेट को हटाने के लिए अपने मौजूदा Criteria पर Projections.distinct(...) क्यों न जोड़ें?

http://docs.jboss.org/hibernate/envers/3.6/javadocs/org/hibernate/criterion/Projections.html

अद्यतन

उदाहरण के लिए, यदि आप कर्मचारी नाम पर एक SELECT DISTINCT (या कुछ पहचानकर्ता (रों)) लागू करने के लिए अद्वितीय कर्मचारियों की एक सूची प्राप्त करना चाहते हैं, तो आप कुछ कर सकते हैं इस तरह: -

List result = session.createCriteria("employee") 
      .setProjection(Projections.distinct(Projections.property("name"))) 
      .add(Restrictions.eq("name", "John")) 
      .addOrder(Order.asc("city")) 
      .addOrder(Order.asc("state")) 
      .list(); 

इस तरह, आप वास्तव में Set उपयोग करने के बारे में चिंता करने की जरूरत नहीं है।

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