ジェネリックTからのクラスの派生
-
03-07-2019 - |
質問
基本的なcrud操作を実行するパラメーター化された休止状態のdaoがあり、パラメーター化が特定のdaoの基本的なcrud操作を実行するためのデリゲートとして使用される場合
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID>
実行時にTからClassを派生させて、Hibernateで次のような条件クエリを作成できるようにします。
public T findByPrimaryKey(ID id) {
return (T) HibernateUtil.getSession().load(T.getClass(), id);
}
知っています:
T.getClass()
存在しませんが、実行時にTから正しいClassオブジェクトを導出する方法はありますか?
ジェネリックとリフレクションを調べましたが、適切な解決策を思いついていません。おそらく何かが欠けています。
ありがとう。
解決
コンストラクター引数としてクラスを渡すことができます。
public class HibernateDao <T, ID extends Serializable> implements GenericDao<T, ID> {
private final Class<? extends T> type;
public HibernateDao(Class<? extends T> type) {
this.type = type;
}
// ....
}
他のヒント
リフレクションを使用して、型引数class
のT
を把握する方法があります:
private Class<T> persistentClass = (Class<T>)
((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
使用方法は次のとおりです。
public class GenericDaoJPA<T> implements GenericDao<T> {
@PersistenceContext
protected EntityManager entityManager;
protected Class<T> persistentClass = figureOutPersistentClass();
private Class<T> figureOutPersistentClass() {
Class<T> clazz = (Class<T>)((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0];
log.debug("persistentClass set to {}", clazz.getName());
return clazz;
}
public List<T> findAll() {
Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e");
return (List<T>) q.getResultList();
}
}
これは、ConcreteEntityDao
がHibernateDao<ConcreteEntity,...>
の直接のスーパークラスである場合にのみ機能すると思われます。
ここで見つけました:www.greggbolinger.com/blog/2008/04/17/1208457000000.html
所属していません StackOverflow