Hibernate 5.2.2中createCriteria()方法的替代代码

San*_*osh 4 hibernate

在Hibernate 5.2.2中,不推荐使用createCriteria()方法.请提供替代解决方案和代码段.

Criteria criteria=session.createCriteria(Student3.class);   
List<Student3> studentsNameList= criteria.list();           

        for (Student3 studentName : studentsNameList) {
            System.out.println("Student details - "+studentName.getName()+" -- "+studentName.getEmail());   }   
Run Code Online (Sandbox Code Playgroud)

在谷歌搜索我发现DetachedCriteria 可以使用而不是createCriteria()它没有list()方法

DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Student3.class);
Run Code Online (Sandbox Code Playgroud)

bsh*_*use 6

我刚刚完成同样的事情.Hibernate文档说使用JPA Criteria.这是我想出来的......

import javax.persistence.criteria.CriteriaQuery;

CriteriaQuery<Student3> cq = session.getCriteriaBuilder().createQuery(Student3.class);
cq.from(Student3.class);
List<Student3> studentsNameList = session.createQuery(cq).getResultList();

for (Student3 studentName : studentsNameList) {
    System.out.println("Student details - "+studentName.getName()+" -- "+studentName.getEmail());   
}   
Run Code Online (Sandbox Code Playgroud)

不那么优雅,但打字.

- 更新 - 我还没有详细介绍细节,但这里是我如何添加一个实际标准:

import javax.persistence.criteria.CriteriaQuery;
CriteriaBuilder cb = session.getCriteriaBuilder();
CriteriaQuery<Student3> cq = cb.createQuery(Student3.class);

Root<Student3> studentRoot = cq.from(Student3.class);
ParameterExpression<Integer> id = cb.parameter(Integer.class);

cq.select(studentRoot).where(cb.eq(studentRoot.get("id"),id));

 TypedQuery<Student3> query = em.createQuery(cq);
 query.setParameter(p, 2);
 List<Student3> results = query.getResultList();
Run Code Online (Sandbox Code Playgroud)

再一次,我只是在学习JPA所以可能有一种更简单的方法(如果你找到了什么,我很想知道它)

  • 现在感谢它的工作。你能帮我在这段代码中添加限制和设置投影吗?之前很容易像-criteria.add(Restrictions.gt("id",2));criteria=criteria.setProjection(Projections.property("email") ); (2认同)