SpringDataJpa复杂查询-动态查询条件

Jpa的Dao层只继承Repository做复杂查询,不能做到不传某不一个条件,where子句根据条件是否为空动态设置条件。
类似Mybatis中的if判断:


and a.create_time = #{createTime,jdbcType=VARCHAR}

解决

Dao层继承Repository同时继承JpaSpecificationExecutor实现动态设置查询条件:

public interface XxxDao extends JpaRepository,JpaSpecificationExecutor {
}

JpaSpecificationExecutor接口已存在5个方法:

Optional findOne(@Nullable Specification var1);

List findAll(@Nullable Specification var1);

Page findAll(@Nullable Specification var1, Pageable var2);

List findAll(@Nullable Specification var1, Sort var2);

long count(@Nullable Specification var1);

Dao查询直接使用上述5个方法任何一个,Specification对象直接内部类形式重写toPredicate方法:

@Override
//s,s1,s2为查询条件,前台不传就查询所有,s3为查询前多少条数据
public List queryXxxs(String s, String s1, String s2, int s3) {
//排序
Sort sort = new Sort(Sort.Direction.DESC,"sort","updateTime");

    PageRequest pageRequest = PageRequest.of(0,s3,sort);
    return XxxDao.findAll((Specification) (root, criteriaQuery, criteriaBuilder) -> {
        List predicates = new ArrayList<>();
        if(StringUtils.isNotEmpty(s)){
            predicates.add(criteriaBuilder.like(root.get("genre").as(String.class),"%" + s + "%"));

        }
        if(StringUtils.isNotEmpty(s1)){
            predicates.add(criteriaBuilder.like(root.get("subject").as(String.class),"%" + s1 + "%"));

        }
        if(StringUtils.isNotEmpty(s2)){
            predicates.add(criteriaBuilder.like(root.get("no").as(String.class),"%" + s2 + "%"));

        }
        Predicate[] predicate = new Predicate[predicates.size()];
        return criteriaBuilder.and(predicates.toArray(predicate));
    },pageRequest).getContent();
}

·

OK,实现了复杂查询,前台不输入就没有这个条件,按照排序字段和更新时间排序,前台想要几条自己定。jpa还是很方便的,


还有别的方法可以评论一起讨论讨论。

你可能感兴趣的:(SpringDataJpa复杂查询-动态查询条件)