谓词不过滤

时间:2018-06-26 10:06:26

标签: java spring-data-jpa specifications predicate jpa-criteria

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

没有答案