使用Hibernate标准获取通用列表

时间:2016-05-21 18:12:07

标签: hibernate generics

我有两个类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无法解析为变量

有没有办法达到我想要的目的?

如果是,请帮我举例或更正我的代码。

由于

1 个答案:

答案 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();
    }
}

以上允许您从接口存根中推断出类型参数,然后在实现类中的方法中使用该捕获的类型。