我是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應該傳遞的參數?
我在添加您的建議後編輯了該問題。 – Pankaj