详解弹簧数据JPA动态条件查询的写法

  

我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现。

  

如果是查询条件是动态的,框架也提供了查询接口。

        JpaSpecificationExecutor      

,和其他接口使用方式一样,只需要在你的刀接口继承即可(官网代码)。

        公共接口CustomerRepository延伸CrudRepository<客户、Long> JpaSpecificationExecutor {   …   }      

JpaSpecificationExecutor提供很多条件查询方法。

        公共接口JpaSpecificationExecutor{   T findOne (Specificationvar1);      ListfindAll (Specificationvar1);      PagefindAll (Specificationvar1,可分页var2);      ListfindAll (Specificationvar1, var2);      长计数(Specificationvar1);   }   之前      

比如方法:

        ListfindAll (Specificationvar1);      

就可以查找出符合条件的所有数据,如果你的框架使用的是前段分页的技术,那么这个方法就挺简便的。

  

那么这个方法该如何使用呢?我们看到它需要的参数是一个

        org.springframework.data.jpa.domain.Specification      

对象。那我们就创建这个对象先看看。

        规范规范=新规范(){   @Override   公共谓词toPredicate(根的根,CriteriaQuery CriteriaQuery, querybuilder querybuilder) {   返回null;   }   }      

IDE自动生成了要重写的方法toPredicate。

  

根参数是我们用来对应实体的信息的.criteriaBuilder可以帮助我们制作查询信息。

     /* *   *根类型在from子句中。   *查询根总是参考实体。   *   * @param & lt; X>引用的实体类型的根   2.0 * @since Java持久性   */公共接口Root扩展From{…}         /* *   *用于构造标准查询、复合选择,   *表情,谓词,排序。   *   * & lt; p>注意,& lt; code> Predicate</code>是用来代替& lt; code> Expression& # 060; Boolean& # 062; & lt;/code>   *在此API解决Java的事实   *与varags仿制药不兼容。   *   2.0 * @since Java持久性   */公共接口querybuilder {…}      

querybuilder对象里有很多条件方法,比如制定条件:某条数据的创建日期小于今天。

        criteriaBuilder.lessThan (root.get (“createDate”),今天)      

该方法返回的对象类型是谓词。正是toPredicate需要返回的值。

  

如果有多个条件,我们就可以创建一个谓词集合,最后用querybuilder的和和方法进行组合,得到最后的谓词对象。

     /* *   *创建一个给定限制的连接谓词。   * 0谓词的结合是正确的。   *   * @param零个或多个谓词限制的限制   *   * @return和谓词   */谓语(谓语……限制);      之前         /* *   *创建一个析取给定限制的谓词。   *的析取零谓词是错误的。   *   * @param零个或多个谓词限制的限制   *   * @return或谓词   */谓语或谓语……限制);      之前      

示例:         公共ListminDate findByCondition(日期、日期maxDate字符串昵称){   ListresultList=零;   规范querySpecifi=new Specification () {   @Override   公共谓词toPredicate (Root根,CriteriaQuery<& # 63;比;criteriaQuery querybuilder querybuilder) {      List谓词=new ArrayList<在();   如果(零!=minDate) {   predicates.add (criteriaBuilder.greaterThan (root.get (“subscribeTime”), minDate));   }   如果(零!=maxDate) {   predicates.add (criteriaBuilder.lessThan (root.get (“subscribeTime”), maxDate));   }   如果(零!=昵称){   predicates.add (criteriaBuilder.like (root.get(“昵称”)、“%”+昵称+“%”));   }   返回criteriaBuilder.and(谓词。toArray(新谓词[predicates.size ())));   }   };   resultList=this.weChatGzUserInfoRepository.findAll (querySpecifi);   返回resultList;   }   之前      

详解弹簧数据JPA动态条件查询的写法