我正在从Hibernate 3.x升级到最新的Hibernate 5.2.0最终版。在我的旧代码中,我们使用条件查询,如下所示。
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()方法已被弃用。它可以在以下文档中找到。
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标准。以下是我基于上述背景提出的几个问题。
返回条件= DetachedCriteria.forClass(Employee.class);criteria.add(Restrictions.eq(“部门”,部门));返回(列表) getHibernateTemplate().findByCriteria(criteria);
会话=getHibernateTemplate().getSessionFactory().getCurrentSession();部门标准= DetachedCriteria.forClass(Employee.class);criteria.add(Restrictions.eq(“部门”,部门));返回标准.getExecutableCriteria(session).list();
如果有更好的方法来解决这个问题,请提出建议,因为我不想改变HibernateDAOSupport和HibernateTemplate的用法。
发布于 2017-05-25 12:42:03
使用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();
发布于 2016-06-24 19:32:52
文档链接后面是状态:
旧版Hibernate org.hibernate.Criteria应用编程接口,应视为已弃用
因此,只需切换到DetachedCriteria将摆脱当前的折旧,但建议使用JPA标准(不支持org.hibernate.criterion.Restrictions等)。目前还不清楚,路线图也没有太大帮助。
它确实提到了:
最终,特定于Hibernate的标准特性将作为对JPA javax.persistence.criteria.CriteriaQuery的扩展进行移植。
你在这方面有没有进一步的进展?
发布于 2016-07-28 17:22:13
在hibernate 5.2中,org.hibernate.Session
实现了javax.persistence.EntityManager
,因此您可以直接使用Session
创建条件查询。参见JPA - Criteria API。
但是在hibernate 5.2.1中可能有一个bug。最后,如果调用JPA接口TypedQuery#getResultList
,setCacheable
将不起作用,请调用Query#list()
。
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
}
https://stackoverflow.com/questions/37857482
复制相似问题