2016-04-13 10 views
0

Betrachten Sie das folgende Schema:JPA Vererbungs query (Eklipse-Link)

public class A { 
    @Id 
    int id; 
    String fieldA; 
} 
public class B extends A { 
    String fieldB; 
} 
public class C extends A { 
    String fieldC; 
} 

Wie kann ich A so abfragen alle die C ‚s zu bekommen und erhalten nur die B 's wo fieldB="someValue"?

habe ich versucht, treat zu verwenden, um gesenkten zu machen, aber es scheint, dass die Filter auf B auf alle der übergeordnete Klasse arbeiten (A).

Ist eine solche Abfrage in erster Linie möglich?

Antwort

2

Sie können eine Abfrage mit dem ‚Typ‘ Keyword erstellen nach Typ filtern und eine existiert subquery die C Einheiten zu filtern:

select a 
from A a 
where type(a) = :type 
or exists (
    select 1 
    from B b 
    where b.id = a.id 
    and b.fieldB = :fieldB 
) 

der Klassentyp der Einheit C durch Aufrufen der setParameter Methode übergeben wird die Abfrage-Instanz.

+1

Sie sollten OR anstelle von UND für die Existierungsklausel verwenden. – Chris

+0

Danke Chris, dummer Fehler von mir. Behoben! –

+0

Ja, ich habe dieses Problem mit Similer Ansatz gelöst, aber gibt es einen Build-in-Befehl, um es zu lösen. eigentlich habe ich 5 Klasse erben die Hauptklasse und ich mache 2 - 3 Filter in jeder Unterklasse. mit oder mit dem Typ führen mich zu einer Monster-Abfrage (das wird die Leistung sicher beeinflussen) –