2012-08-28 24 views
0

我是Java Generics的新手。我正在設計我的DAO層。我在Spring中使用JPA。我有一個由所有其他DAO類擴展的BaseDAO。如何將Generics應用於不使用該類型參數的方法

public abstract class BaseDAO<E, Id extends Serializable> implements IBaseDAO<E, Id> { 

private Class<E> entityClass; 

@PersistenceContext 
private EntityManager entityManager; 

public EntityManager getEntityManager() { 
    return entityManager; 
} 

@SuppressWarnings("unchecked") 
public BaseDAO() { 
    ParameterizedType genericSuperclass = (ParameterizedType) getClass() 
      .getGenericSuperclass(); 
    this.entityClass = (Class<E>) genericSuperclass 
      .getActualTypeArguments()[0]; 
} 

@Override 
public E create(E entity) { 
    entityManager.persist(entity); 
    return entity; 
} 

//Some more methods 

@Override 
public List<?> executeNativeQuery(String queryString, 
     Map<String, Object> param) { 

//implementation goes here 

    return resultList; 
} 

} 

我將公開名單executeNativeQuery(字符串的queryString, 地圖PARAM)這一類已經問題。因爲如果我必須在擴展BaseDAO的類A中使用此方法,那麼必須爲基類指定類型參數'E'和'Id'。理想情況下,類型參數應該是我們打算進行數據庫調用的實體類。但由於這種方法是本地查詢方法,因此我不使用實體類。我如何處理這種情況?

編輯:下面 假設是延伸BaseDAO並使用executeNativeQuery方法的DAO類

公共類MyDAO擴展BaseDAO {

public String myMethod(){ 

String query="select a1,a2,a3,b4 from A a, B b where a.pk=b.pk"; 
... 
.. 
List<String> = executeNativeQuery(query, map, String.class); 

... 
.. 
} 

}

,如果我我仍然會得到下面的錯誤不要爲BaseDAO指定類型參數。

java.lang.Class中不能轉換爲java.lang.reflect.ParameterizedType在org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328)

應該是什麼類型BaseDAO應該傳遞的參數?

回答

3

您可以按照以下步驟操作。

@Override 
public <T> List<T> executeNativeQuery(String queryString, 
     Map<String, Object> param, Class<T> clazz) { 

//implementation goes here 

    return resultList; 
} 

在第三個參數中,您可以指定要使用的列表的類型。例如, List<SomeEntity> result = executeNativeQuery("query", paramMap, SomeEntity.class)

+0

我在添加您的建議後編輯了該問題。 – Pankaj

0

正如我所看到的,問題出現在以下行的構造函數中。

ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); 

您應該使用getGenericInterfaces()[0]代替,因爲BaseDAO類不從任何擴展(因此你Object作爲父),但實現IBaseDAO

相關問題