2012-03-28 13 views
14

का उपयोग कर दो गैर-संबंधित तालिकाओं में शामिल हों, मुझे संपत्ति के दो जेपीए इकाइयों में शामिल होने की आवश्यकता है जब दोनों के बीच कोई एफके/पीके संबंध नहीं है। मैं हाइबरनेट का उपयोग कर रहा है और इसजेपीए EntityManager

select foo, bar from FooEntity as foo, BarEntity as bar 
where foo.someothercol = 'foo' and foo.somecol = bar.somecol 

तरह HQL क्वेरी का उपयोग कर सकते हालांकि, मैं हाइबरनेट पर निर्भरता से बचने और बजाय EntityManager उपयोग करना चाहते हैं। कृपया मदद करें।

उत्तर

19

आपकी क्वेरी मान्य जेपीक्यूएल है और हाइबरनेट विशिष्ट कार्यक्षमता का उपयोग नहीं करती है (केवल बार के बीच की जगह और गायब है)। जेपीए में 2.0 विनिर्देश (4.4.5 में शामिल) इस इन शब्दों के साथ समझाया गया है:

एक भीतरी शामिल होने परोक्ष FROM खंड में एक कार्तीय उत्पाद के उपयोग के द्वारा निर्दिष्ट किया जा सकता है और कहां खंड में एक शर्त में शामिल होने के । किसी भी स्थिति की अनुपस्थिति में, यह कार्टेशियन उत्पाद को कम कर देता है।

में शामिल होने के इस सामान्यीकृत शैली के लिए मुख्य उपयोग के मामले जब एक शर्त में शामिल होने के एक विदेशी कुंजी रिश्ता है कि है एक इकाई संबंध को मैप किया को शामिल नहीं करता है। उदाहरण: चयन सी से ग्राहक ग,

कर्मचारी ई कहां c.hatsize = e.shoesize

आपकी क्वेरी के लिए मुख्य अंतर यह है कि आपके चुनिंदा संस्थाओं के दो प्रकार के होते हैं। क्वेरी का परिणाम ऑब्जेक्ट की सूची है []। सरणी में तत्वों का क्रम चुनिंदा कथन जैसा है। आपके मामले में निम्नलिखित कार्य:

String query = 
    "select foo, bar from FooEntity as foo, BarEntity as bar "+ 
    "where foo.someothercol = 'foo' and foo.somecol = bar.somecol"; 
List<Object[]> results = em.createQuery(query).getResultList(); 

for (Object[] fooAndBar: results) { 
    FooEntity foo = (FooEntity) fooAndBar[0]; 
    BarEntity bar = (BarEntity) fooAndBar[1]; 
    //do something with foo and bar 
} 
+0

स्थान बार के बीच गायब था और समाप्त हो गया है! –