私はJava Genericsが初めてです。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クラスであるとします
public class 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 の型パラメーターを指定しないと、以下のエラーが発生します。
org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:328) で java.lang.Class を java.lang.reflect.ParameterizedType にキャストできない
BaseDAO に渡す必要がある型パラメーターは何ですか?