我们在使用SpringData JPA框架时,进行条件查询,如果是固定条件的查询,我们可以使用符合框架规则的自定义方法以及@Query注解实现。
如果是查询条件是动态的,框架也提供了查询接口。
JpaSpecificationExecutor
,和其他接口使用方式一样,只需要在你的刀接口继承即可(官网代码)。
公共接口CustomerRepository延伸CrudRepository<客户、Long> JpaSpecificationExecutor { … }
JpaSpecificationExecutor提供很多条件查询方法。
公共接口JpaSpecificationExecutor{ T findOne (Specification var1); List findAll (Specification var1); Page findAll (Specification var1,可分页var2); List findAll (Specification var1, var2); 长计数(Specification var1); } >之前 比如方法:
ListfindAll (Specification var1); 就可以查找出符合条件的所有数据,如果你的框架使用的是前段分页的技术,那么这个方法就挺简便的。
那么这个方法该如何使用呢?我们看到它需要的参数是一个
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字符串昵称){ List resultList=零; 规范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动态条件查询的写法