从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 type; public HibernateDao(Class 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(); } } 

我想这只适用于你的ConcreteEntityDaoHibernateDao的直接超类。

我在这里找到了它:www.greggbolinger.com/blog/2008/04/17/1208457000000.html