2014-11-03 10 views
6

Ich denke, das ist einfach, aber ich kann es nicht herausfinden.Wie konstruiere ich eine inverse Join für eine unidirektionale Beziehung?

Wenn ich Entitäten Foo und Bar:

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

@Entity 
class Bar{ 
    @Column 
    int data; 
} 

und wenn ich einen Join (javax.persistence.criteria.Join<Foo, Bar>) Objekt erstellt werden soll, kann ich es wie folgt tun:

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

Aber wie kann ich machen eine inverse

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

kommen, da ich in der Klasse Bar nicht ein Java-Feld haben, die es Punkte ist Foo paren t, es ist eine unidirektionale Beziehung?

+0

Nun, die offensichtliche Antwort ist: es ist nicht eine unidirektionale Beziehung, wenn Sie eine inverse beitreten müssen. Haben Sie mit einer bidirektionalen Beziehung ausgecheckt (Hinzufügen von '@ ManyToOne' zu' Bar')? – mabi

+0

Ich habe das berücksichtigt, aber ich möchte das möglichst vermeiden. –

+0

Sie müssen dann wahrscheinlich auf eine rohe SQL-Abfrage zurückgreifen. Ich weiß nicht, wie ich tun soll, was du willst, und IMHO sollte es keinen geben. – mabi

Antwort

0

Wenn das, was Sie brauchen, eine bekannte Bar ist, die ihr zugehöriges Foo ist, würde das passen. Der Satz wird nicht in einen SQL JOIN übersetzt, aber er ist semantisch äquivalent.

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 frage mich, ob es mit ** gleich ** statt ** in ** –

+0

funktioniert ** fooRoot.get ("bars") ** ist eine Sammlung. Mit ** equal ** würde versucht werden, ein einzelnes Element (** barRoot **) mit einer Sammlung zu vergleichen, was falsch ist. –

+0

Ah, danke, hab es! –

Verwandte Themen