2011-08-09 18 views
8

मेरे पास एक हाइबरनेट मानदंड कॉल है जिसे मैं एक SQL कथन में निष्पादित करना चाहता हूं। जो मैं करने की कोशिश कर रहा हूं वह माता-पिता के चुनिंदा उदाहरण हैं जिनके पास संपत्तियों की एक श्रृंखला (एसक्यूएल इन क्लॉज) में संपत्ति है, जबकि बाहरी बहिष्कार का उपयोग करके बच्चों को लोड करते समय। यहाँ मैं अब तक है:बच्चों पर प्रतिबंधों के साथ हाइबरनेट मानदंड

Criteria c = session.createCriteria(Parent.class); 

c.createAlias("children", "c", CriteriaSpecification.LEFT_JOIN) 
      .setFetchMode("c", FetchMode.JOIN) 
      .add(Restrictions.in("c.property", properties)); 

c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

return c.list(); 

यहाँ कुछ नमूना डेटा है:

Parent 
Parent ID 
A 
B 
C 

Children 
Child ID Parent ID property 
...   A   0 
...   A   2 
...   A   7 
...   B   1 
...   C   1 
...   C   2 
...   C   3 

मुझे क्या करना चाहते हैं माता पिता और उनके सभी बच्चों लौट अगर बच्चों में से एक एक संपत्ति के बराबर है है मेरी बाध्य पैरामीटर (ओं)। आइए मान लें कि गुण एक सरणी है जिसमें {2} है। इस मामले में, कॉल माता-पिता ए और सी वापस कर देगा लेकिन उनके बाल संग्रह में केवल तत्व 2 होगा। I.e. जनक [बच्चों]:

एक [2] & सी [2]

क्या मैं चाहता हूँ है:

एक [0, 2, 7] & सी [1, 2 3]

यदि यह एक बग नहीं है, तो यह एक टूटा अर्थपूर्ण प्रतीत होता है। मैं नहीं देखता कि एगेट चिल्ड्रेन() या सीज चिल्ड्रेन() को कैसे कॉल करना और 1 रिकॉर्ड वापस करना कभी सही माना जाएगा - यह एक प्रक्षेपण नहीं है। अर्थात। अगर मैं डिफ़ॉल्ट लाने का चयन का उपयोग करने के क्वेरी को बढ़ाने, यह यद्यपि प्रश्नों की एक भीड़ के साथ उचित बच्चों संग्रह देता है,:

c.createAlias("children", "c").add(
     Restrictions.in("c.property", properties)); 

यह एक बग है? यदि नहीं, तो मैं अपना वांछित परिणाम कैसे प्राप्त कर सकता हूं?

उत्तर

1

getChildren() केवल गेटर/सेटर का नाम है, आपकी क्वेरी यह निर्धारित करेगी कि वस्तुएं कैसे आबादी में आती हैं।

मैं यहाँ लगता है कि पहले भाग बाहर थूक

SELECT * FROM Parent 
INNER JOIN Child c ON ... 
WHERE c.property in (x,y,z) 

जो आप नहीं प्राप्त करता है कि आप क्या चाहते जा रहा हूँ।

SELECT * FROM Parent 
WHERE ParentID IN (SELECT DISTINCT parentID FROM Child WHERE c.property in (x,y,z)) 

आपके मानदंड उलटफेर उचित रूप से चाल हो सकती है, तो पिछले एक इस क्वेरी का निर्माण नहीं कर रहा है: क्या आप अगर आप कच्चे एसक्यूएल में इस लिख रहे थे क्या करना चाहते हैं, तो इस है। (क्या आप प्रत्येक पोस्ट के लिए हाइबरनेट उत्पन्न कर सकते हैं?)

+1

ठीक है, एसक्यूएल आसान हिस्सा है। मैं जो खोज रहा हूं वह मानदंड कॉल है। ;) इसके अलावा, ध्यान रखें कि इसे बच्चों की संस्थाओं को पॉप्युलेट करने के लिए बाहरी शामिल होने की आवश्यकता होगी। –

+0

तो दूसरा प्रश्न माता-पिता और आलसी बच्चों को लोड कर रहा है? – dfb

+0

हां, प्रत्येक अभिभावक रिकॉर्ड के लिए एक बाल प्रश्न निष्पादित किया जा रहा है, जिसे मैं टालने की कोशिश कर रहा हूं। ऐसा लगता है कि यह वास्तव में एक दोष हो सकता है, लेकिन अगर कोई कामकाज करता है तो मैं उत्सुक हूं: https://hibernate.onjira.com/browse/HHH-3524 –

0

मैं बाल वर्ग के साथ मानदंड शुरू करूंगा। आपको सभी बच्चों के साथ एक सूची मिल जाएगी, और फिर आप प्रत्येक बच्चे के लिए माता-पिता को फिर से शुरू कर सकते हैं।

2
 Criteria c = session.createCriteria(Parent.class); 

    c.createAlias("children", "children"); 
    c.add(Restrictions.in("children.property", properties)); 

    c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY); 

    return c.list(); 
0

यह काम के आसपास काम में किया जा सकता है।

Criteria c1 = session.createCriteria(Child.class); 
c1.add(Restrictions.in("property", properties)); 
c1.setProjection(Projections.distinct(Projections.property("parentId"))); 
List<Integer> parentIds = c1.list(); 

Criteria c2 = session.createCriteria(Parent.class); 
c2.createAlias("children", "children"); 
c2.add(Restrictions.in("id", parentIds)); 
return c2.list(); 
संबंधित मुद्दे