jpa Specification 复杂条件搜索

1. and

build.conjunction()

        Specification<ApplicationEntity> specification = (root, query, build) -> {
            Predicate predicate = build.conjunction();
            if (ObjectUtil.isNotNull(applicationTypeEnum)) {
                predicate.getExpressions().add(build.equal(root.get("appType"), applicationTypeEnum.getCode()));
            }
            if (ObjectUtil.isNotNull(dataItemStatus)) {
                predicate.getExpressions().add(build.equal(root.get("status"), dataItemStatus));
            }
            return predicate;
        };
        return applicationRepository.findAll(specification);

2. or

builder.disjunction()

            // 构建搜索条件(编码所有的都不能重复,路由是每个应用下不能重复) or
            Specification<MenuEntity> specification = (root, query, builder) -> {
                Predicate predicate = builder.disjunction();
                if (StrUtil.isNotBlank(param.getRouter())) {
                    predicate.getExpressions().add(builder.and(
                            builder.equal(root.get("applicationId"), param.getApplicationId()),
                            builder.equal(root.get("router"), param.getRouter())
                    ));
                }
                if (StrUtil.isNotBlank(code)) {
                    predicate.getExpressions().add(builder.equal(root.get("code"), code));
                }
                return CollUtil.isEmpty(predicate.getExpressions()) ? null : predicate;
            };

            MenuEntity one = menuDao.getRepository().findOne(specification).orElse(null);

注意:如果没有添加任何条件到 disjunction 中,Hibernate 会自动地添加一个始终为 false 的条件。这将导致生成的 SQL 语句类似于 WHERE (0=1),这样的查询永远不会返回任何结果。为了避免这种情况,你需要确保至少添加一个条件到你的逻辑或 (OR) 的谓词中或者像上面一样返回 null

3. 自由组合

        // 构建搜索条件
        Specification<AssetModelRelEntity> specification = (root, query, build) -> {
            // 定义条件谓词列表
            List<Predicate> predicates = new ArrayList<>();
            if (CollUtil.isNotEmpty(modelIds)) {
                predicates.add(build.or(
                        build.in(root.get("sourceModelId")).value(modelIds),
                        build.in(root.get("targetModelId")).value(modelIds)
                ));
            }
            if (CollUtil.isNotEmpty(userIds)) {
                predicates.add(build.in(root.get("createBy")).value(userIds));
            }
           return CollUtil.isEmpty(predicates) ? null : build.or(predicates.toArray(new Predicate[0]));
        };

最后是build.or(),如果没有至少一个条件永远成立,还需要判断一下

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值