11

我有一个参数化的休眠 dao,它执行基本的 crud 操作,当参数化用作委托来完成给定 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 对象?

我看过泛型和反射,但没有想出合适的解决方案,也许我遗漏了一些东西。

谢谢。

4

2 回答 2

17

您可以将 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;
    }

    // ....

}
于 2009-04-29T11:38:29.047 回答
7

有一种方法可以使用反射找出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();
    }

}

我想这仅在您ConcreteEntityDaoHibernateDao<ConcreteEntity,...>.

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

于 2009-05-20T12:57:37.300 回答