2012-05-28 8 views
5

以前はリフレクションを使ってクラスを動的に取得し、フィールド値を設定していました。私のGoogle検索では、ダイナミックタイプのキャストにリフレクションを使用する可能性があることがわかりました。次のように動的にリストを設定する<type>

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

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; 
    } 
} 

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

私が渡しているtablename文字列をリストの型に変換するにはどうすればよいですか?

答えて

5

コンパイル時にすべてのジェネリックス情報がJavaコードから削除されるため、たとえ可能であっても、キャストのみが存在し、リフレクションを使用するため、作られるべきキャスト。あなたが行うことができるようになります

最も近いものではなく、文字列に送信するのではクラスオブジェクトを送信、です。呼び出し元コードは、どのクラスを使用しているかを(呼び出し元はおそらくどのような種類のオブジェクトを使用しているかを知っていると)言わなければならず、リストを正しいgenericにするために使用します。

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も閉じてください。

関連する問題