jpa自定义条件分页查询
Posted it-taosir
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jpa自定义条件分页查询相关的知识,希望对你有一定的参考价值。
主要依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
这里以我最近自己瞎折腾的项目部分代码为例子(仅展示主要部分):
实体类名称(Confusion)
需要注意的是
类上+ @Entity
主键字段+ @Id
package cn.zytao.taosir.disabuse.dao; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaSpecificationExecutor; import cn.zytao.taosir.common.model.disabuse.Confusion; public interface ConfusionRepository extends JpaRepository<Confusion,String>, JpaSpecificationExecutor<Confusion>{ }
JpaRpository这里就不多讲了,需要注意的是,同时继承JpaSpecificationExecutor
我们发现,继承该类后,可以使用相关的API
注意Specification类
通过源码可以发现这个方法,关键就是重写它了
在Service层中
@SuppressWarnings({ "deprecation", "serial" }) @Override public Page<Confusion> findByPageAndParams(Confusion params, int pageNumber, int pageSize) { Pageable pageable = new PageRequest(pageNumber, pageSize); Specification<Confusion> confusion=new Specification<Confusion>() { @Override public Predicate toPredicate(Root<Confusion> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) { Path<String> theme = root.get("theme"); return criteriaBuilder.like(theme, "%"+params.getTheme()+"%"); } }; return confusionRepository.findAll(confusion, pageable); }
以上仅做参考,CriteribBuilder用于构造自定义的查询条件(即条件构造器)
通过相关的方法,我们可以采用类字符串拼接的方式,以节点把多个 criteriaBuilder 拼成一个 criteriaBuilder
之后在toPredicate方法返回即可
控制层
public JSONObject findByParamAndPage(@RequestBody Confusion confusion, int pageNumber, int pageSize) { Page<Confusion> result = confusionService.findByPageAndParams(confusion, pageNumber, pageSize); JSONObject data=new JSONObject(); data.put("content", result.getContent()); data.put("totalNums", result.getTotalElements()); data.put("totalPages",result.getTotalPages()); return ActionHelper.responseOk(data); }
因为这里我的项目使用的是分布式的一个实现方式,所以这里不提供@RequestMapping,自行编写
下面看看在swagger2下的效果。
以上是关于jpa自定义条件分页查询的主要内容,如果未能解决你的问题,请参考以下文章