0

私は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 に渡す必要がある型パラメーターは何ですか?

4

2 に答える 2

3

以下のようにできます。

@Override
public <T> List<T> executeNativeQuery(String queryString,
        Map<String, Object> param, Class<T> clazz) {

//implementation goes here

    return resultList;
}

3 番目のパラメーターでは、操作するリストのタイプを指定できます。例)List<SomeEntity> result = executeNativeQuery("query", paramMap, SomeEntity.class).

于 2012-08-28T18:25:15.243 に答える
0

ご覧のとおり、問題は次の行のコンストラクターにあります。

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

クラスは何からも拡張されないため (したがって、親として取得されます)、 を実装するgetGenericInterfaces()[0]ため、代わりにを使用する必要があります。BaseDAOObjectIBaseDAO

于 2012-08-28T20:04:47.677 に答える