2012-05-24 12 views
12

मेरे डेटाबेस में मेरे पास एक टेस्ट टेबल है, कॉलम के साथ: testName, testType एक ही प्रकार Ie "सूर्य" के साथ 2 अलग-अलग परीक्षण हैं, इसलिए मैं उनमें से केवल एक चाहता हूं जिसके लिए मैं नीचे के रूप में मेरे हाइबरनेट/मानदंड में अलग का उपयोग करें, लेकिन यह अभी भी मुझे "सूर्य" के समान नाम के साथ दोनों प्रकार दे रहा है।हाइबरनेट मानदंड में अलग कैसे जोड़ें

 Criteria crit = session.createCriteria(Test.class); 

    final ResultTransformer trans = new DistinctRootEntityResultTransformer(); 
    crit.setResultTransformer(trans); 
    List rsList = trans.transformList(crit.list()); 

कोई विचार क्या कारण हो सकता है, या डुप्लीकेट फ़िल्टर करने का कोई अन्य तरीका क्या हो सकता है।

उत्तर

22

Projections.distinct का उपयोग करें।

Criteria crit = session.createCriteria(Test.class).setProjection(
    Projections.distinct(Projections.projectionList() 
    .add(Projections.property("type"), "type")) 
.setResultTransformer(Transformers.aliasToBean(YourBean.class)); 

List lst = crit.list(); 

जहां YourBean.class की संपत्ति "प्रकार" है। लौटाई गई सूची होगी।

+0

धन्यवाद, अब यह सही परिणाम दे रहा है, लेकिन यह इस कथन के बाद एक स्ट्रिंग के रूप में है, जबकि मैं पूरी वस्तु चाहता हूं और पूरी वस्तु वापस कर दूं, मुझे टेस्टनाम वैल्यू भी चाहिए, मैं – user1226162

+0

कैसे प्राप्त कर सकता हूं मैंने वस्तुओं की सूची लौटने के लिए जवाब संपादित किया है। – Dandy

+5

@ डेन्डी, अच्छा जवाब प्रदान किया गया लेकिन मुझे अभी भी समस्या हो रही है। मुझे प्राप्त होने वाला बीन केवल "प्रकार" है। टेस्ट क्लास के अन्य गुणों में शून्य या 0 मान हैं। अद्वितीय मूल्य प्रतिबंध के साथ मैं उन मानों को कैसे प्राप्त कर सकता हूं। – RAS

1

एक ही समस्या थी और समूह द्वारा प्रक्षेपण द्वारा हल करने और फिर आवश्यक सभी कॉलम में जोड़ने का समाधान समाप्त हो गया। उदाहरण

Criteria query = session.createCriteria(Class.class) 
    .setProjection(Projections.projectionList() 
     .add(Projections.groupProperty("Col1"), "Col1") 
     .add(Projections.groupProperty("Col2"), "Col2")) 
    .setResultTransformer(Transformers.aliasToBean(Class.class)); 
List list = query.list(); 
4

के लिए मैं अंत में पता चला है अन्य स्तंभों के मूल्यों को प्राप्त करने के लिए:

Criteria criteria = session.createCriteria(Test.class); 
ProjectionList projectionList = Projections.projectionList(); 
ProjectionList projectionList2 = Projections.projectionList(); 
projectionList2.add(Projections.distinct(projectionList.add(Projections.property("distinctColumn"), "distinctColumn"))); 
projectionList2.add(Projections.property("col1"), "col1"); 
projectionList2.add(Projections.property("col2"), "col2"); 
criteria.setProjection(projectionList2); 
criteria.setResultTransformer(Transformers.aliasToBean(Test.class)); 
List list = criteria.list(); 
0

अनुमान केवल चिह्नित गुणों का परिणाम प्रदान करते हैं। लेकिन, यह बच्चों की संस्थाओं के लिए समस्या पैदा करता है। मुझे जिस वास्तविक समस्या का सामना करना पड़ा, उसके लिए मेरी पोस्ट देखें।

Hibernate: Parent and Child relationship data structure

10

कोशिश उपयोग करने के लिए:

cr.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

यह उपयोग करने के लिए मेरे लिए पूरी तरह से काम

+1

क्या आप इस बारे में अधिक जानकारी जोड़ सकते हैं कि यह आपके लिए क्यों काम करता है? –

+0

ग्रेट उत्तर, मेरे मामले के लिए भी काम करता है साथ ही केवल 1 अतिरिक्त लाइन (10 के बजाय ...) – argh

+2

यह बहुत सीमित समाधान है। ResultTransformer का उपयोग करते समय, हाइबरनेट में SQL क्वेरी में DISTINCT शामिल नहीं है, इसलिए हम पेजिंग (सीमा/ऑफ़सेट) के साथ परेशानी में पड़ते हैं। – Eugene

0

प्रयास करें:

Criteria criteria = 
    session.createCriteria(Test.class).setProjection(
     Projections.distinct(Projections.property("testType"))); 
List<Test> rsList = criteria.list(); 
0

कोशिश setResultTransformer (Criteria.DISTINCT_ROOT_ENTITY)

मानदंड आलोचक = session.createCriteria (Test.class); सूची सूची = crit.setResultTransformer (मानदंड.DISTINCT_ROOT_ENTITY) .list();

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