2014-11-03 7 views
6

मुझे लगता है कि यह आसान है, लेकिन मैं इसे समझ नहीं सकता।मैं एक unidirectional रिश्ते के लिए एक व्यस्त शामिल कैसे बना सकता हूँ?

तो मेरे पास है संस्थाओं फू और बार:

@Entity 
class Foo{ 
    @OneToMany 
    List<Bar> bars; 
} 

@Entity 
class Bar{ 
    @Column 
    int data; 
} 

और अगर मैं एक में शामिल हों (javax.persistence.criteria.Join<Foo, Bar>) वस्तु बनाना चाहते हैं, मैं यह कर सकता इस तरह:

Root<Foo> root = ...; 
Join<Foo,Bar> join = root.join(Foo_.bars); 

लेकिन यह कैसे मैं कर सकते हैं एक व्युत्क्रम में शामिल होने

Join<Bar,Foo> inverseJoin = barRoot.join....()...? 

के बाद से मैं कक्षा बार है कि यह की ओर इशारा में एक जावा क्षेत्र की जरूरत नहीं है बनाने के फू कोष्ठक है टी, यह unidirectional संबंध है?

+0

ठीक है, स्पष्ट उत्तर यह है: यदि आपको एक व्यस्त जुड़ाव की आवश्यकता है तो यह एक unidirectional संबंध नहीं है। क्या आपने बिडरेक्शनल रिलेशनशिप का उपयोग करके चेक आउट किया है ('@ ManyToOne' को 'बार' में जोड़ना)? – mabi

+0

मैंने इसे माना है, लेकिन यदि संभव हो तो मैं इससे बचना चाहूंगा। –

+0

आपको शायद कच्चे SQL क्वेरी का सहारा लेना पड़ सकता है। मैं जो चाहता हूं उसे करने के तरीके के बारे में नहीं जानता और आईएमएचओ एक नहीं होना चाहिए। – mabi

उत्तर

0

यदि आपको जो चाहिए वह ज्ञात बार दिया जाता है जो इसके संबंधित फू है, यह फिट होगा। वाक्य को एसक्यूएल जॉइन में अनुवादित नहीं किया जाएगा लेकिन यह अर्थात् समकक्ष है।

CriteriaBuilder cb = entityManager.getCriteriaBuilder(); 
CriteriaQuery<Foo> cq = cb.createQuery(Foo.class); 

Root<Foo> fooRoot = cq.from(Foo.class); 
Root<Bar> barRoot = cq.from(Bar.class); 

cq.select(fooRoot); 
cq.where(barRoot.in(fooRoot.get("bars"))); 
+0

** barRoot.in ** I आश्चर्य है कि यह ** ** –

+0

** ** के बजाय ** बराबर ** ** के साथ काम करता है ** fooRoot.get ("बार") ** एक संग्रह है। ** बराबर ** का उपयोग करना एक तत्व (** barRoot **) को किसी संग्रह में तुलना करने का प्रयास करेगा, जो गलत है। –

+0

आह, धन्यवाद, समझ गया! –

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