我有两个类State和City以及两个单独的 DAO 对象,可以在 State 和 City CRUD 操作>
List<Chapter> getAllStates();
int save(State state);
和
List<City> getAllCities();
int save(Citycity);
我可以有更多的课程需要拥有自己的DAO。
我想使用泛型,这样我只有一个 DAO 对象可以在任何给定类型上执行 CRUD 。
我正在努力。
@Override
public <T> List<T> getAllItems() {
return sessionFactory.getCurrentSession().createCriteria<T>().list();
}
给出以下错误:
令牌上的语法错误“(”,此标记后面的表达式“
和
@Override
public <T> List<T> getAllItems() {
return sessionFactory.getCurrentSession().createCriteria(T).list();
}
显示
T无法解析为变量
有没有办法达到我想要的目的?
如果是,请帮我举例或更正我的代码。
由于
答案 0 :(得分:1)
您的问题有几种解决方案。使用您的示例,最简单的方法是将类类型作为方法参数传递:
public <T> List<T> findAll(Class<T> clazz) {
return sessionFactory.getCurrentSession().createCriteria(clazz).list();
}
但如果您正在寻找一种更优雅的方式,那么需要参与基于泛型的类和接口来实现这一目标:
public interface GenericDAO<T> {
List<T> findAll();
}
public class GenericDAOImpl<T> implements GenericDAO<T> {
private final Class<T> entityClass;
/* others stuff */
public GenericDAOImpl() {
ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass();
this.entityClass = (Class<T>)type.getActualTypeArguments()[0];
}
public List<T> findAll() {
return sessionFactory().getCurrentSession().createCriteria(entityClass).list();
}
}
以上允许您从接口存根中推断出类型参数,然后在实现类中的方法中使用该捕获的类型。