Java Hibernate 5.2中SharedSessionContract.createCriteria(类persistentClass)的正确替代方案
我正在从Hibernate3.x升级到最新的Hibernate5.2.0Final。在我的旧代码中,我们使用的条件查询如下Java Hibernate 5.2中SharedSessionContract.createCriteria(类persistentClass)的正确替代方案,java,spring,hibernate,hibernate-5.x,Java,Spring,Hibernate,Hibernate 5.x,我正在从Hibernate3.x升级到最新的Hibernate5.2.0Final。在我的旧代码中,我们使用的条件查询如下 Session session =getHibernateTemplate().getSessionFactory().getCurrentSession(); Criteria criteria = session.createCriteria(Employee.class); criteria.add(Restrictions.eq("Department", depa
Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return criteria.list();
现在,从Hibernate 5.2.0开始,createCriteria方法已被弃用。可从以下文档中找到
文件建议使用JPA标准。以下是基于上述背景我提出的几个问题
由于我们没有使用EntityManager,并且严重依赖HibernateDAOSupport和HibernateTemplate,我如何使用session或sessionFactory使用JAP标准
如果我在下面的代码片段中使用DetachedCriteria,它将与以前的实现相同,还是下面的代码将提供与会话无关的结果
DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return (List<Employee>) getHibernateTemplate().findByCriteria(criteria);
如果有更好的方法处理此问题,请提出建议,因为我不想更改HibernateDataSupport和HibernateTemplate的使用。以下文档链接是状态: 旧版Hibernate org.Hibernate.Criteria API,应视为已弃用 因此,只需切换到DetachedCriteria即可摆脱当前的折旧,但建议使用不支持org.hibernate.Criteria.Restrictions等的JPA标准。目前还不清楚,路线图也没有多大帮助 它确实提到: 最终,特定于Hibernate的criteria特性将作为JPA javax.persistence.criteria.CriteriaQuery的扩展进行移植 在hibernate 5.2中,org.hibernate.Session实现了javax.persistence.EntityManager,因此您可以直接使用Session创建条件查询。看 但是hibernate 5.2.1中可能有一个bug。如果调用JPA Criteria API TypedQuerygetResultList,则调用Querylist,则setCacheable不起作用
public <T> T getAll(Class<T> clazz, boolean cache){
CriteriaQuery<T> query = getCurrentSession().getCriteriaBuilder().createQuery(clazz);
query.select(query.from(clazz));
Query<T> q = getCurrentSession().createQuery(query); // CriteriaQueryTypeQueryAdapter instance
q.setCacheable(cache); // execute AbstractProducedQuery#setCacheable
// return q.getResultList(); // CriteriaQueryTypeQueryAdapter#getResultList(), cache not works
return q.list(); // AbstractProducedQuery#list() cache may be enabled
}
使用CriteriaBuilder,如下所述:
//Use below imports:
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
//creating session. This you can create in your own way.
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
cfg.addAnnotatedClass(Employee.class);
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
//**creating CriteriaBuilder**
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
Root<Employee> employeeRoot=criteria.from(Employee.class);
criteria.select(employeeRoot);
//**Adding where clause**
criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01"));
List<Employee> employeeList=session.createQuery(criteria).getResultList();
考虑到我来自5.1,我很高兴我不是世界上唯一一个对Hibernate的突然变化感到困惑的人。我不知道是应该开始考虑如何使用标准实施,还是回到5.1。很好的例子是:
//Use below imports:
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
//creating session. This you can create in your own way.
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml");
cfg.addAnnotatedClass(Employee.class);
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
//**creating CriteriaBuilder**
CriteriaBuilder builder = session.getCriteriaBuilder();
CriteriaQuery<Employee> criteria = builder.createQuery(Employee.class);
Root<Employee> employeeRoot=criteria.from(Employee.class);
criteria.select(employeeRoot);
//**Adding where clause**
criteria.where(builder.equal(employeeRoot.get("employeeId"), "E01"));
List<Employee> employeeList=session.createQuery(criteria).getResultList();