2014-11-03 9 views
6

Myślę, że to jest łatwe, ale nie mogę tego rozgryźć.Jak utworzyć sprzężenie odwrotne dla relacji jednokierunkowej?

Jeśli mam podmioty Foo i Bar:

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

@Entity 
class Bar{ 
    @Column 
    int data; 
} 

i jeśli chcę utworzyć join (javax.persistence.criteria.Join<Foo, Bar>) obiektu, mogę to zrobić tak:

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

ale jak mogę Wykonaj odwrotne połączenie

ponieważ nie mam pola java w pasku klasy, który wskazuje na to Foo Paren t, jest to relacja jednokierunkowa?

+0

Cóż, oczywista odpowiedź brzmi: nie jest to związek jednokierunkowy, jeśli potrzebujesz połączenia odwrotnego. Czy wypróbowałeś używając dwukierunkowej relacji (dodając '@ ManyToOne' do' Bar')? – mabi

+0

Rozważałem to, ale chciałbym tego uniknąć, jeśli to możliwe. –

+0

Najprawdopodobniej konieczne będzie odwołanie się do surowego zapytania SQL. Nie wiem, jak to zrobić, a IMHO nie powinno być. – mabi

Odpowiedz

0

Jeśli to, czego potrzebujesz, otrzymasz znany pasek, który należy do Foo, to pasuje. Zdanie nie zostanie przetłumaczone na SQL JOIN, ale jest semantycznie równoważne.

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 zastanawiam się, czy działa z ** równym ** zamiast ** w ** –

+0

** fooRoot.get ("bars") ** to kolekcja. Użycie ** equal ** spowoduje próbę porównania pojedynczego elementu (** barRoot **) z kolekcją, która jest niepoprawna. –

+0

Ah, dzięki, rozumiem! –

Powiązane problemy