3 Stimmen

Das Lesen aus mehreren Tabellen und das Bevölkern mehrerer Entitäten mithilfe von JPA SqlResultSetMapping

Ich habe eine JSF-Anwendung unter Verwendung von JPA zum Zugriff auf die Datenbank erstellt. Es gibt eine Reihe von Entitäten.

Ich möchte ein Suchergebnisbildschirm erstellen, der Spalten aus mehr als einer Entität in einer Tabelle anzeigt. Diese Entitäten haben keine Fremdschlüsselbeziehungen.

Um dies zu erreichen, habe ich ein EnttityManager.createNativeQuery verwendet und ein EntityMapping angegeben, wie folgt:

 Query q = em.createNativeQuery(
     "select t.id as id1, t.bb as bb1, t.cc as cc1," +
     "t2.id as id2, t2.aa as aa2, t2.bb as bb2 " +
     " from table1 t, table2 t2 where t.cc = '22' and t2.id = 2", "TestMapping");

 result = q.getResultList();

TestMapping sieht so aus:

 @SqlResultSetMapping(name =
 "TestMapping", entities = {
     @EntityResult(entityClass = Table1.class, fields = {
         @FieldResult(name = "id", column = "id1"),
         @FieldResult(name = "bb", column = "bb1"),
         @FieldResult(name = "cc", column = "cc1")}
         ),
     @EntityResult(entityClass = Table2.class, fields = {
         @FieldResult(name = "id", column = "id2"),
         @FieldResult(name = "aa", column = "aa2"),
         @FieldResult(name = "bb", column = "bb2")}
         )
     } )

Dies funktioniert, wenn ich alle Spaltennamen aus beiden Entitäten in der Abfrage angebe, was in diesem kleinen Beispiel in Ordnung ist, aber die Suchergebnisse müssen aus 4 Entitäten auswählen, die alle eine große Anzahl von Spalten haben. Wenn ich nicht alle Spalten im EntityMapping angebe, wird eine Ausnahme im Aufruf von getResultList() geworfen.

Meine Frage lautet: Ist es möglich, nur die in der Abfrage ausgewählten Spalten im EntityMapping anzugeben, anstatt alle aus den Entitäten angeben zu müssen?

0voto

teacurran Punkte 2823

Ich weiß nicht, ob dies mit allen JPA-Implementierungen funktioniert. Wenn Sie Hibernate verwenden, können Sie alle Ihre Eigenschaften mit dem Lazy-Fetch-Typ zuordnen:

@Basic(fetch = FetchType.LAZY)
Date dateCreated;

@Column(length=100)
@Basic(fetch = FetchType.LAZY)
String name;

Sie müssen dann Ihre Klassen instrumentieren, da sie sonst die Lazy-Eigenschaften ignorieren:

0voto

tinesoft Punkte 736

Oder Sie können auch die Syntax entity.* verwenden, um alle Spalten von 'entity' auf einmal zu spezifizieren:

Query q = em.createNativeQuery("select t.*, t2.*" + " from table1 t, table2 t2"+
                               "where t.cc = '22' and t2.id = 2", "TestMapping");

Und TestMapping:

@SqlResultSetMapping(name = "TestMapping", 
entities = { @EntityResult(entityClass =Table1.class), 
             @EntityResult(entityClass =Table2.class)})

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X