2016-03-14 107 views
0

我報告模塊上工作的列表的方法。每個報告至少運行一個獨特的數據庫查詢來收集報告數據。抽象,返回對象

即使報告查詢是獨一無二稱他們的方法是相同的。

我試圖抽象方法返回一個列表,以便我可以通過一個通用的方法調用,而不必爲每個對象我想要得到的結果爲一個單獨的方法我唯一的查詢。

的方法會是這個樣子:

public List<?> getQueryResults(EntityManager em, String query, 
List<String> parameters, Class clazz) { 
    TypedQuery<?> query = em.createQuery(query, clazz); 

    // set parameters here... 

    List<?> results = query.getResultList(); 

    return results; 
} 

上述流程是相當多重複所有查詢。必須設置的參數通常是三種不同的配置,所以我可以單獨處理。

我想弄明白的是,如何傳遞給方法或以某種方式派生出我需要用於TypedQuery<?>List<?>的類。

我希望我能做到這一點TypedQuery<clazz>但不起作用。我應該使用反射並從clazz參數中派生出來嗎?

回答

3

如果你把泛型類型上clazz參數,您可以使用您的返回值:

public <T> List<T> getQueryResults(EntityManager em, String query, 
    List<String> parameters, Class<T> clazz) { 
    TypedQuery<T> query = em.createQuery(query, clazz); 

    // set parameters here... 

    List<T> results = query.getResultList(); 

    return results; 
} 

(你不應該在代碼中的原始類型,反正 - 你應該有Class<?>最起碼)

+0

丟失的一塊拼圖。你說的是有道理的。我的代碼中顯然出現了泛型知識差距。謝謝。 – wiredniko