0

我是 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 传递的类型参数应该是什么?

4

2 回答 2

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).

于 2012-08-28T18:25:15.243 回答
0

如我所见,问题出在下一行的构造函数中。

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

您应该getGenericInterfaces()[0]改用,因为BaseDAO该类不从任何东西扩展(因此您Object作为父级)而是实现IBaseDAO.

于 2012-08-28T20:04:47.677 回答