2017-07-26 97 views
0

我在一個需要在關係數據庫中實現繼承的項目上工作。我不得不基於一張桌子來構建它。假設我有A,B和C類型,構造函數A(TypeEnum類型),B(String bProp),C(String cProp),B和C是A的子類型,而表A有ID,TYPE,A_PROP,B_PROP列。我可以獲取A的子類型列表,並只需要一個特定的字段來創建一個對象,如跟隨方法?Jooq - 泛型獲取子類型

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

回答

1

當然可以。有點更詳細:

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

我的意思是我有任何存在類型的單個表。 BTW。我找到了解決方案。您必須將jpa包中的@Column(value =「COLUMNNAME」)註釋添加到您的域類。 –

+0

@JakubRozenbajger:隨意爲您自己的問題提供一個答案! –