Smr*_*thy 23 java spring hibernate hibernate-5.x
我正在从Hibernate 3.x升级到最新的Hibernate 5.2.0 FINAL.在我的旧代码中,我们使用标准查询,如下所示.
Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();
Criteria criteria = session.createCriteria(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return criteria.list();
Run Code Online (Sandbox Code Playgroud)
现在,从Hibernate 5.2.0开始,不推荐使用createCriteria()方法.可以从以下文档中找到.
https://docs.jboss.org/hibernate/orm/5.2/javadocs/deprecated-list.html https://docs.jboss.org/hibernate/orm/5.2/javadocs/org/hibernate/SharedSessionContract.html#createCriteria -java.lang.Class-
文档建议使用JPA Criteria.以下是基于上述背景的几个问题.
由于我们没有使用EntityManager并且严重依赖于HibernateDAOSupport和HibernateTemplate,我如何使用session或sessionFactory来使用JAP Criteria?
如果我使用DetachedCriteria,如下面的代码片段,它将与以前的实现相同或下面的代码将给我们会话独立的结果?
DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return (List<Employee>) getHibernateTemplate().findByCriteria(criteria);
Run Code Online (Sandbox Code Playgroud)另外,如果我以下面提到的方式使用DetachedCriteria,它将与我的旧代码具有相同的影响.
Session session =getHibernateTemplate().getSessionFactory().getCurrentSession();
DetachedCriteria criteria = DetachedCriteria.forClass(Employee.class);
criteria.add(Restrictions.eq("Department", department));
return criteria .getExecutableCriteria(session).list();
Run Code Online (Sandbox Code Playgroud)如果有更好的方法来处理这个请建议,因为我不想改变HibernateDAOSupport和HibernateTemplate的使用.
使用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();
Run Code Online (Sandbox Code Playgroud)
文档链接后面是状态:
“旧版 Hibernate org.hibernate.Criteria API,应视为已弃用”
因此,只需切换到 DetachedCriteria 即可消除当前的折旧,但建议使用 JPA Criteria(不支持 org.hibernate.criterion.Restrictions 等)。目前还不清楚,路线图也没有多大帮助。
它确实提到:
“最终,Hibernate 特定的标准功能将作为 JPA javax.persistence.criteria.CriteriaQuery 的扩展进行移植”
你对此有进一步的了解吗?
| 归档时间: |
|
| 查看次数: |
12557 次 |
| 最近记录: |