我有添加,更新和删除实体的通用方法。但我也想使用泛型来检索数据。
以下是获取数据的方法:
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知道我在创建条件时想要传递的类?
答案 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