JPA Query: Kann ich Objekte einer Oberklasse über Objekte der Unterklassen abfragen?

Millman

Mitglied
Hallo zusammen,

ich hatte ein wenig Probleme, den folgenden Sachverhalt bereits im Titel hinreichend zu beschreiben:

Ich habe eine Oberklasse O mit drei Unterklassen: O1, O2 und O3.

Nun möchte ich mir über eine JPA Query eine Arraylist<O> zurückliefern lassen, die jedoch aus den Unterklassen(bzw. deren Objekten) O1, O2 und O3 besteht. Ich suche mir also aus den drei Unterklassen die gewünschten Objekte zusammen und gebe diese dann in einer Arraylist<O> der Oberklasse aus.

Ist so etwas möglich und wenn ja könnt ihr mir sagen wie bzw. wo ich das genauer nachlesen kann? In der hiesigen Literatur konnte ich bisher nichts zu diesem Fall finden, welcher in meinen Augen auch etwas speziell ist.

Vielen Dank im Vorfeld.
 
Hallo

was du machen möchtest ist also ein UNION SELECT?

Du hast drei Relationen (Tabellen), die ähnliche Felder hat. Dann musst du drei JPA Querys machen und dann List.addAll() zusammenführen.

Gruß,

Martin
 
Wie genau sehen denn deine Annotation/XML-Mapping aus?

Folgendes funktioniert nämlich ganz leicht:

Java:
@Entity
public abstract class O {
    @Id
    @GeneratedValue
    private Integer id;
    private String value;
    // getter/setter
}
Java:
@Entity public class O1 extends O {}
Java:
@Entity public class O2 extends O {}
Java:
@Entity public class O3 extends O {}
Java:
public class Main {

    public static void main(String[] args) {
        EntityManager em = Persistence.createEntityManagerFactory("TEST").createEntityManager();
        em.getTransaction().begin();
        O1 o1 = new O1();
        o1.setValue("O1");
        em.persist(o1);
        O2 o2 = new O2();
        o2.setValue("O2");
        em.persist(o2);
        O3 o3 = new O3();
        o3.setValue("O3");
        em.persist(o3);
        em.getTransaction().commit();
        em.clear();
        
        List<O> os = em.createQuery("SELECT o FROM O o", O.class).getResultList();
        for (O o : os) {
            System.out.println(o.getValue() + " is a " + o.getClass());
        }
    }

EDIT: Dabei funktionieren natürlich auch WHERE Clauses, solange sich diese auf in der Oberklasse O definierte Werte beziehen.
 
@Marcinek: So einfach ist es leider nicht, ich möchte nur eine Abfrage verwenden, um entsprechende Where-Claueses nutzen zu können.

@mvitz:
Danke, das ist schon ein erster Schritt in die richtige Richtung. Eine Where-Clause muss/möchte ich auf jeden Fall verwenden. Allerdings gibt es noch das Problem, dass jede Unterklasse noch eine Relation zu einem User-Objekt hat, folgendermaßen:

Code:
@Entity public Class User{
List<O1> O1List;
List<O2> O2List;
List<O3> O3List;
}
}

Wir haben hier also noch unidirektionale OneToMany-Beziehungen vom User zu den Unterklassen. Daher kann ich als From-Clause leider nicht einfach die Oberklasse angeben...Zusätzlich möchte ich das ganze im Endeffekt mit der Criteria API ausführen, aber das ist derzeit erstmal nebensächlich, hauptsache es funktioniert irgendwie.

Hättest ihr hinsichtlich dieser Zusatzinfos immer noch eine Lösung für mich?
 
Ich bin nicht so der Fachmann auf dem Gebiet, sondern eher so was in Richtung erweitertes Wissen. Aber erst mal finde ich, dass das Schema ein wenig komisch aussieht. Muss User wirklich wissen ob es ein O1, O2 oder O3 ist?

Was auch helfen würde wäre, wenn du mal die Richtigen Klassen inklusive kleines Beispiel postest und uns zeigst, über welche Attribute du jetzt gerne welches Ergebnis hättest.
 

Zurück
Oben