Spring Jpa 按时间段查询


项目中有需求要按照名称模糊查找和时间段查找数据,可能只有名称没有时间,也可能只有时间没有名称,也可能这几个参数同时匹配,所以要多条件动态查询。

JpaSpecificationExecutor 接口提供很多条件查询方法:

public interface JpaSpecificationExecutor {
    T findOne(Specification var1);

    List findAll(Specification var1);

    Page findAll(Specification var1, Pageable var2);

    List findAll(Specification var1, Sort var2);

    long count(Specification var1);
}

比如方法:

List findAll(Specification var1);


这是项目中的示例:
 @Override
    public List serach(String serach, String stime, String etime) {
        List resultList = null;
        Specification querySpecifi = new Specification() {
            @Override
            public Predicate toPredicate(Root root, CriteriaQuery criteriaQuery, CriteriaBuilder cb) {
                List predicates = new ArrayList<>();
                if (StringUtils.isNotBlank(stime)) {
                    //大于或等于传入时间
                    predicates.add(cb.greaterThanOrEqualTo(root.get("commitTime").as(String.class), stime));
                }
                if (StringUtils.isNotBlank(etime)) {
                    //小于或等于传入时间
                    predicates.add(cb.lessThanOrEqualTo(root.get("commitTime").as(String.class), etime));
                }
                if (StringUtils.isNotBlank(serach)) {
                    //模糊查找
                    predicates.add(cb.like(root.get("name").as(String.class), "%" + serach + "%"));
                }
                // and到一起的话所有条件就是且关系,or就是或关系
                return cb.and(predicates.toArray(new Predicate[predicates.size()]));
            }
        };
        resultList = this.adviceDao.findAll(querySpecifi);
        return resultList;
    }







你可能感兴趣的:(JAVA)