2016-10-12 3 views
0

Ich versuche eine Entität A auszuwählen, die eine B enthält, die eine Liste C enthält, wobei der Wert C.d mit einem Parameter übereinstimmen muss.JPQL zur Auswahl der Entität basierend auf dem Enkelattribut

Meine Entitäten wie folgt aussehen:

@Entity 
class A { 

    @GeneratedValue 
    @Id 
    private Long id; 

    @Column(name="B") 
    @OneToOne(cascade=CascadeType.ALL) 
    @MapsId 
    private B b1; 
} 

@Entity 
class B { 

    @GeneratedValue 
    @Id 
    private Long id; 

    @OneToMany(mappedBy="b2", cascade=CascadeType.ALL) 
    private List<C> cs; 
} 

@Entity 
class C { 

    @GeneratedValue 
    @Id 
    private Long id; 

    @ManyToOne 
    @JoinColumn(name="B") 
    private B b2; 

    private String d; 
} 

Meine naive Ansatz meiner Einheit wie folgt aussehen zur Auswahl:

SELECT entity FROM A entity WHERE entity.b1.cs.d = :d

Wie sollte die Abfrage strukturiert sein?

Antwort

0

versuchen diese

TypedQuery<A> query = em.createQuery("select b.a from B b inner join C c where c.d = :d",A.class); 
List<A> a = query.getResultList(); 
+0

Könnten Sie genauer erklären, wie das funktioniert? Es scheint, eine Liste eher als A zurückzugeben? – span

+0

ja das wird eine Liste von Objekten vom Typ A zurückgeben, wenn Sie sicher sind, dass Ihr Ergebnis nur ein Objekt sein wird, können Sie getSingleResult() anstelle von getResultList() verwenden –

Verwandte Themen