Предикат не фильтруется

Следующая спецификация работает, но выглядит не очень элегантно. Я использую список yearPredicates, когда я знаю только один, и я не знаю, как его использовать. Затем у меня есть два возврата, потому что когда kindPredictes пусто, он не возвращает никаких записей, когда он должен возвращать все с выбранным годом.

Как я уже сказал, работает, но я уверен, что есть более аккуратный способ сделать это. Я изучаю спецификации и предикаты, и я не нашел никакого решения, которое помогло бы мне в этом. Любое предложение приветствуется.

Спасибо!

private Specification<Crop> hasYearAndKind(Crop crop) {
    return new Specification<Crop>() {
        @Override
        public Predicate toPredicate(Root<Crop> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {
            List<Predicate> kindPredicates = new ArrayList<>();
            List<Predicate> yearPredicates = new ArrayList<>();

            if (crop.getKindList() != null) {
                for (String s : crop.getKindList()) {
                    kindPredicates.add(cb.equal(root.get(Crop_.kindId), s));
                }
            }

            if (crop.getCidYr() != null){
                yearPredicates.add(cb.equal(root.get(Crop_.cidYr), crop.getCidYr()));
            }

            if (kindPredicates.isEmpty()){
                return cb.and(cb.and(yearPredicates.toArray(new Predicate[yearPredicates.size()])));
            }else {
                return cb.and(cb.and(yearPredicates.toArray(new Predicate[yearPredicates.size()])), cb.or(kindPredicates.toArray(new Predicate[kindPredicates.size()])));
            }
        }
    };
}

0 ответов

Другие вопросы по тегам