Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate 5.2中SharedSessionContract.createCriteria(类persistentClass)的正确替代方案_Java_Spring_Hibernate_Hibernate 5.x - Fatal编程技术网

Java Hibernate 5.2中SharedSessionContract.createCriteria(类persistentClass)的正确替代方案

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

我正在从Hibernate3.x升级到最新的Hibernate5.2.0Final。在我的旧代码中,我们使用的条件查询如下

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();