如何向CriteriaBuilder.or添加Predicates列表

Kal*_*han 3 java jpa predicate hibernate-criteria spring-data-jpa

我有一个要附加的条件或条件

我面临的问题是当我迭代List并将其添加到CategoryBuilder然后它需要最后一个Predicate

以下是示例:

public static Specification<Billoflading> hasTenantAndBillingCodeCombination(List<WhoOwnsIt> list,
            Date formattedFromDate, Date formattedToDate, String carrierFilter, String supplierFilter,
            String terminalFilter) {
        return (root, query, cb) -> {
            List<Predicate> predicates = new ArrayList<>();

            for (WhoOwnsIt whoOwnsIt : list) {
                String containsLikePatternForTenant = getContainsLikePattern(whoOwnsIt.getWholesalerTenantID(), true);

                Predicate pred = cb.and(cb.like(cb.lower(root.<String>get("tenant")), containsLikePatternForTenant),
                        cb.equal(cb.lower(root.<String>get("billingCode")), whoOwnsIt.getBillingCode()),
                        cb.greaterThanOrEqualTo(root.<Date>get("scheduleDate"), formattedFromDate),
                        cb.lessThanOrEqualTo(root.<Date>get("scheduleDate"), formattedToDate));

                Predicate predWithTenant = null;

                if (null != carrierFilter) {
                    predWithTenant = cb.and(cb.equal(cb.lower(root.<String>get("tenant")), carrierFilter));
                }

                if (null != predWithTenant)
                    predicates.add(predWithTenant);
                else
                    predicates.add(pred);

            }
            Predicate finalPredicate;
            // This commented section below needs to be replaced with a 
            //better solution
            //for(Predicate predicate : predicates){
            //  cb.or(predicate);
            //}

            return finalPredicate;
        };
    }
Run Code Online (Sandbox Code Playgroud)

我还尝试将List作为一个数组,将其传递给finalPredicate.or,如下所示

Predicate finalQuery = cb.or(predicates.toArray());
Run Code Online (Sandbox Code Playgroud)

但是这段代码给出了编译错误,因为所需的参数是varargs即

或方法接受(Predicate ...谓词)作为参数列表

你能为这个问题提供一些简单的解决方案吗?

nic*_*chl 10

试试这个:

Predicate finalQuery = cb.or(predicates.toArray(new Predicate[0]));
Run Code Online (Sandbox Code Playgroud)

  • 感谢您的快速响应,该解决方案有效,但需要稍作编辑,即新谓词[长度],其中长度是需要适应的元素数量它是如此接近,很棒! (2认同)

小智 8

作为补充,我建议对较新的 Java 版本使用以下表示法:

builder.or(predicates.toArray(Predicate[]::new))
Run Code Online (Sandbox Code Playgroud)