主要依赖

<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

T findOne(Specification<T> spec);

List<T> findAll(Specification<T> spec);

Page<T> findAll(Specification<T> spec, Pageable pageable);

List<T> findAll(Specification<T> spec, Sort sort);

long count(Specification<T> spec);

注意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);
}

如果使用的springboot是2.0X以上的版本,new PageRequest的构造方法已经过时,推荐使用

Pageable pageable = PageRequest.of(pageNumber, pageSize);

以上仅做参考,CriteribBuilder用于构造自定义的查询条件(即条件构造器)

通过相关的方法,我们可以用集合来处理多条件的查询,例子

    @Override
public JSONObject list(Integer page, Integer size, String remark,Integer method,Integer status) {
Pageable pageable = PageRequest.of(page-1, size);
Specification<Authority> authorityQuery=new Specification<Authority>() {
@Override
public Predicate toPredicate(Root<Authority> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
List<Predicate> predicates=new ArrayList<>();
if(remark!=null)
predicates.add(criteriaBuilder.like(root.get("remark"), "%"+remark+"%"));
if(method!=null)
predicates.add(criteriaBuilder.equal(root.get("method"), method));
if(status!=null)
predicates.add(criteriaBuilder.equal(root.get("status"), status));
return criteriaBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
}
};
Page<Authority> pageAuthority = authorityMapper.findAll(authorityQuery, pageable);
return ActionHelper.responseOk(pageAuthority.getContent());
}

多条件的例子

控制层

    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自定义条件分页查询的更多相关文章

  1. ASPNETCOREAPI 跨域处理 SQL 语句拼接 多条件分页查询 ASPNET CORE 核心 通过依赖注入(注入服务)

    ASPNETCOREAPI 跨域处理 AspNetCoreApi 跨域处理 如果咱们有处理过MV5 跨域问题这个问题也不大. (1)为什么会出现跨域问题:  浏览器安全限制了前端脚本跨站点的访问资源, ...

  2. asp.net mvc多条件+分页查询解决方案

    开发环境vs2010 css:bootstrap js:jquery bootstrap paginator 原先只是想做个mvc的分页,但是一般的数据展现都需要检索条件,而且是多个条件,所以就变成了 ...

  3. 【java】spring-data-jpa 集成hibernate实现多条件分页查询

    初次接触spring-data-jpa,实现多条件分页查询. 基础环境 Spring Boot+spring-data-jpa+hibernate+mysql 1.接口 要继承这个接口,这个接口提供了 ...

  4. thinkphp 带条件分页查询

    thinkphp 带条件分页查询:form表单传值时候,method='get'. 用 get 传值

  5. 项目一:第四天 1、快递员的条件分页查询-noSession,条件查询 2、快递员删除(逻辑删除) 3、基于Apache POI实现批量导入区域数据 a)Jquery OCUpload上传文件插件使用 b)Apache POI读取excel文件数据

    1. 快递员的条件分页查询-noSession,条件查询 2. 快递员删除(逻辑删除) 3. 基于Apache POI实现批量导入区域数据 a) Jquery OCUpload上传文件插件使用 b) ...

  6. JPA实现复杂条件分页查询

    相信熟悉Hibernate的人对于ORM给编程带来的便利于快捷一定不陌生,相对于MyBatis等需要编写复杂的SQL语句,ORM映射为我们带来的便利显而易见.但是,在获得便利的同时,失去的便是灵活性, ...

  7. spring boot jpa 多条件组合查询带分页的案例

    spring data jpa 是一个封装了hebernate的dao框架,用于单表操作特别的方便,当然也支持多表,只不过要写sql.对于单表操作,jpake可以通过各种api进行搞定,下面是一个对一 ...

  8. JPA分页查询与条件分页查询

    情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查 ...

  9. mongodb多条件分页查询的三种方法(转)

    一.使用limit和skip进行分页查询 public List<User> pageList(int pageNum ,int pageSize){ List<User> u ...

随机推荐

  1. Elasticsearch 入门 - Exploring Your Cluster

    The REST API Cluster Health ( http://localhost:9200/ ) curl -X GET "localhost:9200/_cat/health? ...

  2. 【codeforces 805A】Fake NP

    [题目链接]:http://codeforces.com/contest/805/problem/A [题意] 问你在l..r这个区间内的所有数字: 对于每个数的因子; 出现次数最多的是哪一个; [题 ...

  3. applicationContext-solr.xml

    一.动态切换单机和集群 spring-solr 的配置 <!-- 单机版 solrj --> <bean id = "httpSolrServer" class= ...

  4. (1)spring boot起步之Hello World【从零开始学Spring Boot】

    Spring Boot交流平台 1.1 介绍 自从structs2出现上次的漏洞以后,对spring的关注度开始越来越浓. 以前spring开发需要配置一大堆的xml,后台spring加入了annot ...

  5. [JAVA]比毫秒System.currentTimeMillis()更精确的时间戳(纳米级时间戳)

     纳秒 ns(nanosecond):纳秒, 时间单位.一秒的10亿分之中的一个,即等于10的负9次方秒. 经常使用作 内存读写速度的单位,其前面数字越小则表示速度越快. 1纳秒=1000 皮秒 ...

  6. HDU 4353

    利用分式的性质可以很容易证明要求的是个三角形,这很简单.对于求三角形内的雷的个数,只需求出每条边上方有多少个雷,作一点运算即可.如 A,B,C(B是X轴坐标在中间的点),则AC(其上方的雷的个数)-A ...

  7. ym——物联网入口之中的一个Android蓝牙4.0

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 假设还有同学不知道蓝牙4.0能够做什么请查看Android+蓝牙 4.0 将带来什么? ...

  8. 略微复杂的sql逻辑(从数据库逆序查找有限条记录(limit))并按相反顺序输出

    项目中有一个业务需求是:默认载入15条历史记录(按时间顺序从早到晚). 以下是我构造的sql逻辑,mark一下,亲測可行. SELECT * FROM (SELECT *FROM group_chat ...

  9. Linux就该这么学 20181011(第十五章邮件)

    参考链接:https://www.linuxprobe.com. https://www.linuxprobe.com/chapter-15.html 电子邮箱系统 foxmail MUA 发送 MT ...

  10. 如何让NSURLConnection在子线程中运行

    可以有两个办法让NSURLConnection在子线程中运行,即将NSURLConnection加入到run loop或者NSOperationQueue中去运行. 前面提到可以将NSTimer手动加 ...