将sql查询转换为hibernate criteriaquery

nbysray5  于 2021-08-20  发布在  Java
关注(0)|答案(1)|浏览(309)

我想将其转换为使用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

00jrzges

00jrzges1#

实体管理器的检索取决于您的框架和用例。该解决方案假定您 collegeId , subCodelang 作为方法中的给定值。
您可以为 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();
}

相关问题