为了账号安全,请及时绑定邮箱和手机立即绑定

JPA Criteria API:遍历列表并创建谓词

JPA Criteria API:遍历列表并创建谓词

杨魅力 2022-05-25 10:10:11
我正在尝试使用 Spring boot、Spring data JPA 和 Hibernate 将 iBatis 项目迁移到 rest 服务。我被困在查询转换中,不胜感激。这是我正在尝试迁移的 iBatis 查询。<foreach item="item" collection="currentStatus">    <choose>        <when test="item in fStatusList">            ((j_status_code != #{item}) AND (f_status_code = #{item}) AND            (EXP_FLAG IS NULL OR EXP_FLAG ='F' ))        </when>        <when test="item in jStatusList">            ((max_jsc.status_code = #{item}) AND                <if test="item ==419">                    EXP_FLAG='H'                </if>                <if test="item ==449">                    EXP_FLAG='C'                </if>            </when>        <otherwise>            ((j_status_code = #{item}) AND (f_status_code_name is null))        </otherwise>    </choose></foreach>这就是我到目前为止所拥有的。    CriteriaBuilder cb = entityManager.getCriteriaBuilder();    CriteriaQuery<Job> cq = cb.createQuery(Job.class);    Root<Job> job = cq.from(Job.class);    List<Predicate> predicates = new ArrayList<>();    for (int status : statusList) {    if (IntStream.of(fStatusList()).anyMatch(x -> x == status)) {        predicates.add(cb.equal(job.get("f_status_code"), status));        predicates.add(            cb.or(                cb.isNull(job.get("EXP_FLAG")),                cb.equal(                    job.get("EXP_FLAG"),"F")));      } else if (IntStream.of(jStatusList()).anyMatch(x -> x == status)) {        predicates.add(cb.equal(job.get("jobStatusCode"), status));        if (status == 10) {          predicates.add(              cb.equal(                  job.get("EXP_FLAG"), "H"));        } else if (status == 15) {          predicates.add(              cb.equal(                  job.get("EXP_FLAG"), "C"));        }问题是 where 条件正在形成,如下所示。迭代需要为每个状态添加 OR 条件,而不是 AND。我怎样才能做到这一点?where ( job0_.f_status_code is null )  and job0_.j_status_code=315  and job0_.j_status_code=449  and job0_.exp_flag=?另外请告知在这些情况下使用 JPA Criteria API 是否是最佳选择。对于一些简单的 iBatis 条件,它看起来相当复杂且难以阅读。使用 Hibernate 时有更好的选择吗?
查看完整描述

1 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

CriteriaQuery#where()在传递谓词数组时创建一个连词,即and在它们之间使用运算符。如果您想使用析取,即or运算符,只需将它们包装为CriteriaBuilder#or()

cq.where(cb.or(predicates.toArray(new Predicate[] {})));

关于您的第二个问题,请考虑已弃用 Hibernate Criteria 以支持 JPA Criteria API:Deprecated createCriteria method in Hibernate 5


查看完整回答
反对 回复 2022-05-25
  • 1 回答
  • 0 关注
  • 95 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号