2013-10-23 51 views
0

問題標題感覺很笨拙。我很感激編輯。
我正在嘗試創建一個可重用的查詢,以返回由指定的String指定的某種類型對象的List
這不會工作,但我想這將明確什麼,我試圖做的:如何動態地將某個泛型類型分配給List?

public List<?> getAll(String type) { 
    Class clazz = Class.forName(type); 
    return (List<clazz>) em.createQuery("SELECT t from " + type + " t").getResultList(); 
} 
+2

爲什麼你沒有使用沒有泛型的簡單列表? – Masudul

+0

由於類型刪除,我不認爲這是可能的。 – Christian

+0

你需要像列表一樣的東西,把你從數據庫中獲取的數據或類似的東西 –

回答

5

嘗試使用該類型的類:

public <T> List<T> getAll(Class<T> type) { 
    return em.createQuery("SELECT t from " + type.getSimpleName() + " t").getResultList(); 
} 

注意,這仍然會產生警告,因爲getResultList()返回一個原始列表。

編輯

如果你只有一個完全合格的類名,即你需要調用Class.forName(),有沒有辦法知道在編譯時的類 - 既然泛型(幾乎)是一個編譯時功能只(提示:類型擦除),他們不會在這種情況下幫助。

你仍然可以調用泛型方法與Class.forName()檢索像這樣一類:

List<?> l = getAll(Class.forName(typeName)); 

你也可能不需要獲取類對象本身,如果它只是一個查詢(但是,可能有意義,首先檢查該字符串是否是現有類的名稱)。在這種情況下,你的方法可能是這樣的:

public List<?> getAll(String type) { 
    return em.createQuery("SELECT t from " + type + " t").getResultList(); 
} 

這種變體也將讓您無論是傳遞一個完全合格的類名或實體的名稱,即它會在一定程度上更加靈活。

另外,你可以返回List<Object>,這將允許你添加更多的對象到列表中(但要小心,你可以添加任何東西)。

這就是說,我會盡可能使用第一個選項,第二個選項作爲回退時,具體類型(或至少某些接口)在編譯時未知。

+1

你可以創建'TypedQuery'來代替。 –

+0

如何從'String'獲得'Class '? – Lester

+0

@Lester我會更新答案,但是您沒有辦法直接使用該類而不是類名? – Thomas

相關問題