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.
 
M

Marcinek

Gast
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
 

mvitz

Top Contributor
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.
 

Millman

Mitglied
@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?
 

mvitz

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ARadauer Hibernate Query der Kindelemente, wie bidirektionale Verbindung vermeiden Data Tier 0
E JPA Hibernate Query mit Timestamp hat seltsames Verhalten Data Tier 1
T Named Query Join Data Tier 3
T JPA Query - Verbesserungsvorschlag Data Tier 5
M JPA 2.0: Query mit der Criteria API: Wie case-insensitive machen? Data Tier 1
G JPA 2.0 Query Problem Data Tier 3
T [Hibernate] Named query not found Data Tier 8
byte Hibernate: Query Cache und Assoziationen Data Tier 10
GilbertGrape Probleme mit einem Query (left join) Data Tier 2
M JPA - Query.setFirstResult, Query.setMaxResults - intern? Data Tier 10
lordcarlos XStream + allgemein Objekte und dessen relatios speichern Data Tier 3
F JPA Speichern komplexer Objekte Data Tier 2
G Objekte nach Änderung(extern) aktualisieren Data Tier 11
G Hibernate OneToMany und ManyToOne Objekte löschen Data Tier 13
L JSP Mit Java-Daten von einer Webseite zu ziehen? Data Tier 5
D JPA Entities mit Proxies ausserhalb einer Session (Lazy Loading) Data Tier 0
E JPA Session.delete einer Entity wird nicht ausgeführt Data Tier 2
R NPE beim Persistieren einer Entität Data Tier 6
T JPA Aufbau einer Webapplikation mit JEE Data Tier 2
C Businessmethoden in einer Entität zum bidirektionalen Speichern? Data Tier 2
aze Hibernate Entfernen aus einer Collection soll zum Entfernen einer Beziehung führen Data Tier 3
S (Hibernate) Mapping einer Datenbanktabelle mit mehreren Fremdschlüssel Data Tier 7
G JPA/ Eclipselink: (Alte) Kopie einer Entity? Data Tier 6
M EJBQL: Item aus einer Collection(ManyToOne) löschen Data Tier 7
N Mapping einer 1:n in Hibernate Data Tier 11

Ähnliche Java Themen

Neue Themen


Oben