5

以前は、クラスを動的に取得してフィールド値を設定するなどのことを行うためにのみリフレクションを使用していました。Google 検索で、動的型キャストにリフレクションを使用できる可能性があることがわかりましたか?

私のコードは次のとおりです。

import entity.Shipvia;
import entity.Route;
import java.lang.reflect.Field;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class RetrieveResultList {

    public static List retrieveResultList(String tablename) {
        EntityManager entityManager = Persistence.createEntityManagerFactory("EntityLibraryPU").createEntityManager();
        Query query = entityManager.createNamedQuery(tablename + ".findAll");
        List<Shipvia> resultList = query.getResultList();
        return resultList;
    }
}

このメソッドを使用して、データベース テーブルから動的に結果を取得しています。テーブル名は常に異なるため、テーブルごとに異なるため、リストを持つことはできません。

渡すテーブル名文字列をリストの型に変換するにはどうすればよいですか?

4

1 に答える 1

5

それはできませんし、できたとしても、コンパイル時にJavaコードからすべてのジェネリック情報が削除され、キャストのみが存在し、リフレクションを使用しているため、キャストが作成されないため、役に立ちません。 .

最も近い方法は、 Stringを送信する代わりにClassオブジェクトを送信することです。呼び出し元のコードは、必要なクラスを指定する必要があり (呼び出し元は、使用しているオブジェクトの種類をおそらく知っています)、リストに正しいジェネリックを持たせるためにそれを使用します。

非常に単純な実装は次のようになります。

List<Shipvia> shipvias = RetrieveResultList.retrieveResultList( Shipvia.class );

実装は次のようになります。

public class RetrieveResultList {

    private static final EntityManagerFactory FACTORY = Persistence.createEntityManagerFactory("EntityLibraryPU");

    public static <T> List<T> retrieveResultList(Class<T> type) {
        EntityManager entityManager = FACTORY.createEntityManager();
        String tablename = type.getName(); // figure out table name from **type**
        Query query = entityManager.createNamedQuery(tablename + ".findAll");
        List<T> resultList = query.getResultList();
        entityManager.close();
        return resultList;
    }
}

そして、探しているもののようなものがあるはずです。

また、このメソッドを呼び出すたびにエンティティ マネージャ ファクトリを作成しないでください。エンティティ マネージャ ファクトリは、作成するのに非常にコストのかかるオブジェクトであるため、プロジェクト内でシングルトンにする必要があります。メソッドを終了する前に、作成したEntityManagerも閉じる必要があります。

于 2012-05-28T15:43:23.007 に答える