2017-07-26 2 views
0

Ich arbeite an einem Projekt, in dem ich die Vererbung in einer relationalen Datenbank implementieren muss. Ich bin gezwungen, es basierend auf einem Tisch zu bauen. Angenommen, ich habe A-, B- und C-Typen, Konstruktoren A (TypEnum-Typ), B (Zeichenfolge bProp), C (Zeichenfolge cProp), B und C sind Subtypen von A und Tabelle A hat Spalten ID, TYPE, A_PROP, B_PROP. Kann ich in eine Liste von Untertypen von A holen und nur ein bestimmtes Feld verwenden, um ein Objekt wie in der Follow-Methode zu erstellen?Jooq - generisches Abrufen von Subtypen

List<? extends A> findAll(Class<? extends A> clazz) { 
    return dsl.selectFrom(A) 
     .where(A.TYPE.eq(clazz.getSimpleName())) 
     .fetchInto(clazz);} 

Antwort

1

Sicher. Mit ein bisschen mehr Ausführlichkeit:

public <T extends A> List<T> findAll(Class<T> clazz) { 
    Table<?> table; 

    if (clazz == B.class) 
     table = B_TABLE; 
    else if (clazz == C.class) 
     table = C_TABLE; 
    else 
     throw new IllegalArgumentException("Class not supported: " + clazz); 

    return dsl.selectFrom(table) 
       // For convenience, we can use just any table's TYPE column to get type 
       // safety. Of course, you could abstract over the TYPE column, too... 
       .where(table.field(B_TABLE.TYPE).eq(clazz.getSimpleName())) 
       .fetchInto(clazz); 
} 
+0

Ich meine, ich habe einzelne Tabelle für jeden vorhandenen Typ. Übrigens. Ich habe eine Lösung gefunden. Sie müssen die Annotation @Column (value = "COLUMNNAME") aus dem jpa-Paket zu Ihren Domänenklassen hinzufügen. –

+0

@JakubRozenbajger: Fühlen Sie sich frei, eine Antwort auf Ihre eigene Frage zu geben! –