Предикат не фильтруется
Следующая спецификация работает, но выглядит не очень элегантно. Я использую список 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()])));
}
}
};
}