我是 Java 泛型的新手。我正在设计我的 DAO 层。我在 Spring 中使用 JPA。我有一个由所有其他 DAO 类扩展的 BaseDAO。
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;
}
}
我在将 public List executeNativeQuery(String queryString, Map param) 添加到此类时遇到问题。因为如果我必须在扩展 BaseDAO 的类 A 中使用此方法,我将不得不为基类指定类型参数“E”和“Id”。理想情况下,类型参数应该是我们要进行 db 调用的实体类。但由于此方法是本机查询方法,因此我不使用实体类。我该如何处理这种情况?
编辑:假设下面是扩展 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 不能在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) 处转换为 java.lang.reflect.ParameterizedType
应该为 BaseDAO 传递的类型参数应该是什么?