如何解决将 SQL 查询转换为 Hibernate CriteriaQuery
我想将其转换为使用 javax.persistence.criteria.CriteriaBuilder,但我不确定该怎么做,非常感谢任何帮助!
SELECT * FROM User u INNER JOIN Teacher t ON t.emp_id = u.emp_id WHERE u.college_id=:college_id AND u.Book.sub_code=:sub_code AND t.lang=:lang
解决方法
实体管理器的检索取决于您的框架和您的用例。该解决方案假定您在方法中将 collegeId
、subCode
和 lang
作为给定值。
您为 User
中的 SELECT
创建一个查询,并为该类创建一个 Root
。
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
然后,您加入不同的班级。因为我认为 Book
也是一个需要的类,我也会加入这个。您不必提及应该在哪个 ID 上进行联接,因为您已经使用注释 @Id
提及了哪个值是 ID。
Join<User,Teacher> teacherJoin = root.join(User_.TEACHER);
Join<User,Book> bookJoin = root.join(User_.BOOK);
不同的 WHERE
条件可以添加到条件查询中。为了链接多个 WHERE
条件,我将条件添加到列表中(最终将它们组合起来)。
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(User_.COLLEGE_ID),collegeId));
predicates.add(cb.equal(bookJoin.get(Book_.SUB_CODE),subCode));
predicates.add(cb.equal(teacherJoin.get(Teacher_.LANG),lang));
最终,您必须执行构造的查询。
cq
.select(root)
.where(cb.and(predicates.toArray()));
return entityManager.createQuery(cq).getResultList();
上述答案使用 JPA 元模型生成器来防止您将实际引用名称作为字符串键入。例如,调用 User_.TEACHER
为您提供实际字符串,该字符串引用 Teacher
中的 User
对象。
以下示例显示了将上述代码片段合并到一个函数中。
public List<User> findAllByCollegeIdAndBookSubCodeAndTeacherLang(
String collegeId,int subCode,Lang lang) {
CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<User> cq = cb.createQuery(User.class);
Root<User> root = cq.from(User.class);
Join<User,Teacher> teacherJoin = root.join(User_.TEACHER);
Join<User,Book> bookJoin = root.join(User_.BOOK);
List<Predicate> predicates = new ArrayList<>();
predicates.add(cb.equal(root.get(User_.COLLEGE_ID),collegeId));
predicates.add(cb.equal(bookJoin.get(Book_.SUB_CODE),subCode));
predicates.add(cb.equal(teacherJoin.get(Teacher_.LANG),lang));
cq
.select(root)
.where(cb.and(predicates.toArray()));
return entityManager.createQuery(cq).getResultList();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。