微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将 SQL 查询转换为 Hibernate CriteriaQuery

如何解决将 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

解决方法

实体管理器的检索取决于您的框架和您的用例。该解决方案假定您在方法中将 collegeIdsubCodelang 作为给定值。

您为 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 举报,一经查实,本站将立刻删除。