如何使用Hibernate实现从数据库中获取数据的通用方法?

时间:2013-12-18 16:09:34

标签: java hibernate generics

我有添加,更新和删除实体的通用方法。但我也想使用泛型来检索数据。

以下是获取数据的方法:

public static List<ClassA> getAllClassAData() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(ClassA.class);
    return criteria.list();
}

public static List<ClassB> getAllClassBData() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(ClassB.class);
    return criteria.list();
}

public static List<ClassC> getAllClassCData() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(ClassC.class);
    return criteria.list();
}

我试着做这样的事情:

public static <T> List<T> getAllData() {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(???.class); //Here is where I'm stuck
    return criteria.list();
}

我坚持将该类作为arg传递给标准创建:

 Criteria criteria = session.createCriteria(Generic.class);

如何让JVM知道我在创建条件时想要传递的类?

4 个答案:

答案 0 :(得分:7)

您的通用方法应该更像:

public static <T> List<T> getAllData(Class<T> clazz) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(clazz);
    return criteria.list();
}

你应该像以下一样调用它:

List<ClassA> list = getAllData(ClassA.class);

答案 1 :(得分:2)

模拟动态的一个简单步骤是在查询时传递类实例。它看起来很丑陋,但做的工作。不幸的是,没有办法像T.class

那样做
public static <T> List<T> getAllData(Class<T> klass) {
    Session session = HibernateUtil.getSessionFactory().openSession();
    Criteria criteria = session.createCriteria(klass);
    return criteria.list();
}

答案 2 :(得分:0)

首先静态和泛型不能很好地混合,所以你将不得不取消静态。

接下来看看这是如何处理的, https://github.com/sajit/Webgearz/blob/master/src/main/java/com/webgearz/tb/daos/impl/AbstractMongoDao.java

protected Class<N> persistentClass;

        public Class<N> getPersistentClass() {
                return persistentClass;
        }

及相关课程。这应该有助于你想要实现的目标。

答案 3 :(得分:0)

查看通用存储库模式,它在c#中经常使用,虽然Java中的泛型不同,但您应该能够执行常规的通用运行时黑客来获取基础类型。

http://www.codeproject.com/Articles/526874/Repositorypluspattern-2cplusdoneplusright