下一个规范正在运行,但看起来并不优雅。当我知道只有一个,并且不知道如何使用它时,我使用的是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()])));
}
}
};
}