web-dev-qa-db-ja.com

述語のリストをCriteriaBuilder.orに追加する方法

または条件で追加するリストがあります

私が直面している問題は、リストを反復処理してそれをCategoryBuilderに追加すると、最後の述語が使用されることです。

次に例を示します。

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;
        };
    }

また、次のように、リストをfinalPredicateに渡すための配列にしようとしました。

Predicate finalQuery = cb.or(predicates.toArray());

ただし、必要なパラメータは可変引数であるため、このコードではコンパイルエラーが発生しました。

またはメソッドは(述語...述語)をパラメータリストとして受け入れます

この問題の簡単な解決策を教えてください。

6
Kalyan Pradhan

これを試して:

Predicate finalQuery = cb.or(predicates.toArray(new Predicate[0]));
14
nicoschl