jpa 用于排除多个条件的标准生成器

igetnqfo  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(118)

我有一个如下的sql查询

select * from enquiry where NOT(request_type = 'SELF_SERVICE' and enquiry_status_id = 19);

我的条件查询生成器如下所示

CriteriaBuilder cb = entityManager.getCriteriaBuilder();
        CriteriaQuery<Enquiry> query = cb.createQuery(Enquiry.class);
        Root<Enquiry> enquiryRoot = query.from(Enquiry.class);

        List<Predicate> predicates = new ArrayList<>();
        
        List<Predicate> predicates3 = new ArrayList<>();
        Predicate predicate3 = cb.equal(enquiryRoot.get("requestType"), "SELF_SERVICE");
        Predicate predicate4 = cb.notEqual(enquiryRoot.get("status").get("id"), 19);
        predicates3.add(cb.and(predicate3, predicate4));
        
        predicates.add(cb.and(predicates3.toArray(new Predicate[0])));
        query.where(cb.and(predicates.toArray(new Predicate[0])));

有没有什么方法可以像上面的sql查询一样排除条件?
善意的建议。谢谢。

bprjcwpo

bprjcwpo1#

CriteriaBuilder.not。我认为以下代码很好地Map到您的SQL;请注意,您所显示的条件代码可能并不符合您的要求。
因此,所需的SQL:

select * from enquiry
where NOT(request_type = 'SELF_SERVICE' and enquiry_status_id = 19);

Map到此条件API代码:

query
    .select(enquiryRoot)
    .where(
        cb.not(
                cb.and(
                        cb.equal(enquiryRoot.get("requestType"), "SELF_SERVICE"),
                        cb.equal(enquiryRoot.get("status").get("id"), 19)
                )
        )
    );

相关问题