从Generic T派生类
我有一个参数化的hibernate dao执行基本的crud操作,并且当参数化被用作委托来完成给定dao的基本crud操作时。
public class HibernateDao implements GenericDao
我希望能够在运行时从T派生Class以在Hibernate中创建条件查询,这样:
public T findByPrimaryKey(ID id) { return (T) HibernateUtil.getSession().load(T.getClass(), id); }
我知道:
T.getClass()
不存在,但有没有办法在运行时从T派生正确的Class对象?
我看过generics和反思,但还没有找到合适的解决方案,也许我错过了一些东西。
谢谢。
您可以将类作为构造函数参数传递。
public class HibernateDao implements GenericDao { private final Class extends T> type; public HibernateDao(Class extends T> type) { this.type = type; } // .... }
有如何使用reflection来计算类型参数T
class
:
private Class persistentClass = (Class ) ((ParameterizedType)getClass().getGenericSuperclass()).getActualTypeArguments()[0];
以下是我使用它的方式:
public class GenericDaoJPA implements GenericDao { @PersistenceContext protected EntityManager entityManager; protected Class persistentClass = figureOutPersistentClass(); private Class figureOutPersistentClass() { Class clazz = (Class )((ParameterizedType) (getClass().getGenericSuperclass())).getActualTypeArguments()[0]; log.debug("persistentClass set to {}", clazz.getName()); return clazz; } public List findAll() { Query q = entityManager.createQuery("SELECT e FROM " + persistentClass.getSimpleName() + " e"); return (List ) q.getResultList(); } }
我想这只适用于你的ConcreteEntityDao
是HibernateDao
的直接超类。
我在这里找到了它:www.greggbolinger.com/blog/2008/04/17/1208457000000.html
- Java Generics名称冲突,方法未正确覆盖
- Java – 新的Stack 相当于通用数据类型Stack 的新Stack ?
- 在generics中将@SuppressWarnings(“unchecked”)添加到单行生成eclipse编译器错误
- Java添加到未知类型的通用列表
- 使用reflection在运行时推断javagenerics参数
- 可能是两个类之间的递归Javagenerics
- 在所有方法调用中允许类型见证的重点是什么?
- `copy(List dest,List src)`和`copy(List dest,List src)之间的区别
- 调用TreeSet 时的ClassCastException .contains(Long.valueOf(someLongValue))