2016-06-09 7 views
0

Ich habe drei Klassen: A.java, B.java und C.java. A und B erweitern C. Wie schreibe ich eine JPA-Abfrage, um korrekt zu funktionieren? Ich versuchteJPA-Abfrage mit zwei linken Join

Query query = em.createQuery("select c from C c left join A a left join B b where (c.id = a.id or c.id = b.id)"); 
+0

Wie würden Sie versuchen, diese SQL in Vanille zu schreiben? – Makoto

+0

Bitte lesen Sie http://StackOverflow.com/Help/how-to-ask –

+1

Wie kann jemand dazu kommentieren, ohne die Klassen und die Beziehungen zu sehen? –

Antwort

1

Die kurze Antwort ist, dass Sie nicht tun. In JPA:

Die Standardstrategie, InheritanceType.SINGLE_TABLE, wird verwendet, wenn die @Inheritance Anmerkung auf der Stammklasse der Entitätshierarchie nicht angegeben

Wenn Sie alles aus der Tabelle C wählen, die JPA-Provider-Klassen auf dem discriminator column basierend instanziiert, so

List<C> rl = em.createQuery("select c from C c", C.class).getResultList(); 
System.out.println(rl); 

geben Ihnen:

Hibernate: select c0_.id as id2_0_, c0_.DTYPE as DTYPE1_0_ from C c0 
[[email protected], [email protected], [email protected]] 

Wenn Sie möchten, können Sie den instanceof-Operator in Java verwenden, um die Ergebnistypen zu bestimmen. Wenn Sie eine bestimmte Unterklasse wollen, dann abfragen es einfach:

List<A> rl = em.createQuery("select a from A a", A.class).getResultList(); 
System.out.println(rl); 

, die Sie:

Hibernate: select a0_.id as id2_0_ from C a0_ where a0_.DTYPE='A' 
[[email protected]] 

Referenz: Entity Inheritance