gpt4 book ai didi

java - 如何将泛型应用于不使用类的类型参数的方法

转载 作者:行者123 更新时间:2023-12-02 00:14:13 27 4
gpt4 key购买 nike

我是 Java 泛型新手。我正在设计我的 DAO 层。我将 JPA 与 Spring 一起使用。我有一个 BaseDAO,它由所有其他 DAO 类扩展。

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)列表executeNativeQuery(String queryString, 将 param) 映射到此类。因为如果我必须在扩展 BaseDAO 的 A 类中使用此方法,我将必须为基类指定类型参数“E”和“Id”。理想情况下,类型参数应该是我们要对其进行数据库调用的实体类。但由于此方法是 native 查询方法,因此我不使用实体类。我该如何处理这种情况?

编辑:假设下面是扩展BaseDAO并使用executeNativeQuery方法的DAO类

公共(public)类 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 传递的类型参数是什么?

最佳答案

您可以执行以下操作。

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

关于java - 如何将泛型应用于不使用类的类型参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12165136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com