Спецификация jpa в случае, если toPredicate возвращает null - PullRequest
0 голосов
/ 28 июня 2019

Если я возвращаю null из toPredicate метода, тогда запуск данных репо пружины выбирает * из запроса. Есть способ, если какое-либо значение является нулевым или недействительным, тогда оно не должно запускать любой запрос и возвращать результат как нулевой.

 Specification<MasterTenantParamValue> mstParamValueSpecification = new Specification<MasterTenantParamValue>() {

                private static final long serialVersionUID = 1L;

                @Override
                public Predicate toPredicate(Root<MasterTenantParamValue> mstParamValue, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {

                    List<DependantValue> mstDependantValues = mstparamDependencies.get(parameterId);
                    List<Predicate> predicates = new ArrayList<Predicate>();
                    if(mstDependantValues == null || mstDependantValues.isEmpty() ||  dependsOn.size() != mstDependantValues.size()) {
                        logger.info("Cached Master Dependant Values and requested Dependant Values is not matching");
                        return null;
                    }

                    predicates.add(criteriaBuilder.equal(mstParamValue.get("tenantId"), requestInfo.getTenant()));
                    predicates.add(criteriaBuilder.equal(mstParamValue.get("paramId"), parameterId));
                    predicates.add(criteriaBuilder.like(mstParamValue.get("valueName"), "%" + search + "%"));
                    int index = 0;
                    for(ParameterDTO parameterDTO : dependsOn) {
                        if(mstDependantValues != null) {
                            DependantValue mstDependantValue = mstDependantValues.get(index);//Before check both list size is same or not
                            if(mstDependantValue.getParamId().equals(parameterDTO.getParamId())) {
                                int attribute = mstDependantValue.getAttribute();
                                List<String> valueIds = new ArrayList<>();
                                parameterDTO.getValues().forEach(parameterValue -> {
                                    valueIds.add(parameterValue.getValueId());
                                });
                                if(attribute == 1) {
                                    predicates.add(criteriaBuilder.equal(mstParamValue.get("attr1"), valueIds));
                                } 
                                if(attribute == 2) {
                                    predicates.add(criteriaBuilder.equal(mstParamValue.get("attr2"), valueIds));
                                } 
                                if(attribute == 3) {
                                    predicates.add(criteriaBuilder.equal(mstParamValue.get("attr3"), valueIds));
                                } 
                            }
                        }
                        index++;
                    }
                    return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
                }
            };

            results = masterTenantParamValueRepository.findAll(mstParamValueSpecification);
...