2014-11-03 23 views
6

Sanırım bu kolay, ama anlayamıyorum.Tek yönlü bir ilişki için nasıl ters birleştirme yapıyorum?

ben varsa varlıklar Foo ve Bar:

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

@Entity 
class Bar{ 
    @Column 
    int data; 
} 

ve ben Üyelik (javax.persistence.criteria.Join<Foo, Bar>) nesne oluşturmak istiyorsanız, bunu yapabilirsiniz böyle:

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

Nasıl verebilirim Ben bunu işaret eden sınıf Bar'da bir java alanına sahip olmayan beri ters

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

katılmak yapmak Foo parantez var t, tek yönlü ilişki nedir?

+0

Peki, açık cevap: bir ters birleşmeye ihtiyacınız varsa, tek yönlü bir ilişki değildir. İki yönlü bir ilişki kullanarak kontrol ettiniz mi ('@ ManyToOne'' 'Bar'a eklensin)? – mabi

+0

Bunu düşündüm, ancak mümkünse bundan kaçınmak istiyorum. –

+0

Büyük olasılıkla ham bir SQL sorgusuna başvurmanız gerekebilir. İstediğin şeyi yapmanın yolunu bilmiyorum ve IMHO orada olmamalı. – mabi

cevap

0

İhtiyaç duyduğunuz şey, sahip olduğu Foo adlı bilinen bir Bar verildi ise bu uygun olacaktır. Cümle bir SQL JOIN'e çevrilmeyecek ancak semantik olarak eşdeğerdir.

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 ** ** ** yerine ** ** ile çalışıyorsa ** –

+0

** fooRoot.get ("bar") ** bir koleksiyon olduğunu merak ediyorum. ** ** kullanarak **, tek bir elemanı (** barRoot **) bir koleksiyona karşılaştırmaya çalışır, bu yanlıştır. –

+0

Ah, teşekkürler, anladım! –

İlgili konular