Spirng Data JPA 之Specification中and、or的使用

项目中,有的地方存值以逗号分隔的方式来存储,但查询的时候是需要满足单个值或者多个值条件查询,因此用到Specification中and、or组合使用,此文用来记录,以防后用。

描述:
parentCode逗号分隔,同一parentCode下有且只能有一个名称相同的标签对象,新增传值parentCode逗号分隔,可多个,用下面查询方法来做校验。

    private List<LabelInfo> getDimensionList(LabelInfo labelInfo) {
        Specification<LabelInfo> specification = (Root<LabelInfo> root, CriteriaQuery<?> query,
                                                  CriteriaBuilder criteriaBuilder) -> {
            //parentCode条件拆分组装
            String[] parentCodes = labelInfo.getParentCode().split(",");
            List<Predicate> predicates1 = new ArrayList<>();
            for (String parentCode : parentCodes) {
                if (!StringUtil.isNullStr(parentCode)) {
                    Predicate pred = criteriaBuilder.like(root.get("parentCode"), "%" + parentCode + "%");
                    predicates1.add(pred);
                }
            }
            //or条件组合
            Predicate predicateOr = criteriaBuilder.or(predicates1.toArray(new Predicate[predicates1.size()]));
            predicateOr = criteriaBuilder.and(predicateOr);
            //and条件组合
            List<Predicate> predicates = new ArrayList<>();
            predicates.add(criteriaBuilder.equal(root.get("level"), 3));
            predicates.add(criteriaBuilder.like(root.get("name"), "%" + labelInfo.getName() + "%"));
            Predicate predicateAnd = criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
            //组合查询
            return query.where(predicateOr, predicateAnd).getRestriction();
        };
        return labelInfoRepository.findAll(specification);
    }

如有错误,盼不吝赐教。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值