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

Wesley13
• 阅读 1175

情有独钟的JPA

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

关于JPA的使用

关于 jpa 的使用,下面2步简单过一下,详细资料,小伙伴自行搜索一下吧~

1、导入依赖
<dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency>    mysql、web、druid......</dependency>
2、配置yml

图方便直接贴代码了:

spring:  # 数据源  datasource:    url: jdbc:mysql://127.0.0.1:3306/tmax?useUnicode=true&characterEncoding=utf-8&useSSL=false    username: root    password: 1234    type: com.alibaba.druid.pool.DruidDataSource    driverClassName: com.mysql.jdbc.Driver  jpa:    # 操作数据库时显示sql语句    show-sql: true    # 自动生成表结构    generate-ddl: true    hibernate:      ddl-auto: none    database-platform: org.hibernate.dialect.MySQL57Dialect

分页查询

我们了解 jpa 基本是不用去写 sql 的,继承 JpaRepository 即可,同样也提供给了我们分页查询的方法,「补充:使用分页需要同时继承JpaSpecificationExecutor

举例:

Page<VideoCategory> findByCondition(SearchVo searchVo, Pageable pageable);

通过传入一个遵循 pageale 协议的对象来获取某一页的数据,通过源码查看,发现 Pageable 是一个接口,提供了分页一组方法的声明,如第几页,每页多少条记录,排序信息等,部分方法如下:

int getPageNumber();int getPageSize();int getOffset();Sort getSort();Pageable next();Pageable previousOrFirst();Pageable first();boolean hasPrevious();

通过这些方法我们可以构造我们的 pageable 对象,需要注意的是 jpa 在构造页码初始时,是从 0 开始的。

废话不多说,来看一段代码吧:

1. impl
    @Override    public Page<VideoCategory> findByCondition(VideoCategory videoCategory, SearchVo searchVo, Pageable pageable) {        return videoCategoryDao.findAll(new Specification<VideoCategory>() {            @Nullable            @Override            public Predicate toPredicate(Root<VideoCategory> root, CriteriaQuery<?> cq, CriteriaBuilder cb) {                // 可添加你的其他搜索过滤条件 默认已有创建时间过滤                Path<Date> createTimeField=root.get("createTime");                Path<String> categoryIdField=root.get("categoryId");                List<Predicate> list = new ArrayList<Predicate>();                //创建时间                if(StrUtil.isNotBlank(searchVo.getStartDate())&&StrUtil.isNotBlank(searchVo.getEndDate())){                    Date start = DateUtil.parse(searchVo.getStartDate());                    Date end = DateUtil.parse(searchVo.getEndDate());                    list.add(cb.between(createTimeField, start, DateUtil.endOfDay(end)));                }                // 视频分类                if(StrUtil.isNotBlank(videoCategory.getCategoryId())){                            list.add(cb.equal(categoryIdField,videoCategory.getCategoryId()));                }                Predicate[] arr = new Predicate[list.size()];                cq.where(list.toArray(arr));                return null;            }        }, pageable);    }
2. controller
    @RequestMapping(value = "/getByCondition", method = RequestMethod.GET)    @ApiOperation(value = "多条件分页获取")    public Result<Page<VideoCategory>> getByCondition(            @ModelAttribute VideoCategory videoCategory,            @ModelAttribute SearchVo searchVo,            @ModelAttribute PageVo pageVo){        Page<VideoCategory> page = videoCategoryService.findByCondition(videoCategory, searchVo, PageUtil.initPage(pageVo));        return new ResultUtil<Page<VideoCategory>>().setData(page);    }
3. PageUtil
public static Pageable initPage(PageVo page){        Pageable pageable = null;        int pageNumber = page.getPageNumber();        int pageSize = page.getPageSize();        String sort = page.getSort();        String order = page.getOrder();        if(pageNumber<1){            pageNumber = 1;        }        if(pageSize<1){            pageSize = 10;        }        if(StrUtil.isNotBlank(sort)) {            Sort.Direction d;            if(StrUtil.isBlank(order)) {                d = Sort.Direction.DESC;            } else {                d = Sort.Direction.valueOf(order.toUpperCase());            }            Sort s = new Sort(d, sort);            pageable = PageRequest.of(pageNumber-1, pageSize, s);        } else {            pageable = PageRequest.of(pageNumber-1, pageSize);        }        return pageable;    }

转载自:https://www.cnblogs.com/niceyoo/p/10817290.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
菜鸟阿都 菜鸟阿都
3年前
pageHelper一对多分页解决方案
前言   pageHelper是一款优秀的Mybatis分页插件,在项目中可以非常便利的使用,使开发效率得到很大的提升,但不支持一对多结果映射的分页查询,所以在平时的使用时,对于一对多分页会出现分页错误,这篇文章主要对pageHelper分页错误进行重现以及提出解决方案。分析    mybatis进行一对多查询时,映射文件(mapper.xml
待兔 待兔
2个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
2年前
springBoot+react实现增改查
1、页面查询功能带分页后端代码:/ @AuthorMc @Description:根据条件查询角色列表信息 @Date2018/4/1910:49 /@OverridepublicResp
Stella981 Stella981
2年前
Spring Data Jpa 返回自定义对象 DTO 映射问题
关键字:JPA复杂查询,JPA返回自定义实体,JPA返回自定义DTO,JPA联表查询,JPA原生SQL查询,JPA踩坑新冠疫情之下,闲来无事研究了一下JPA,发现坑还是不少的,特地记录一下,有兴趣的道友可以看看。在灵活性上JPA比不上MyBatis,比如想联表查询返回一个自定义的实体Dto,结果发现不能直接返回自定义的实体,典型错误如下:
Wesley13 Wesley13
2年前
MySQL · 性能优化 · MySQL常见SQL错误用法
1\.LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create\_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。SELECTFROMoperationWHEREty
Wesley13 Wesley13
2年前
mysql5.6 分页查询优化
mysql5.6分页查询优化场景:表结构:主键(非自增)contentCode(varchar),过滤条件列为updateTime(timeStamp),已经为timestamp建立索引。搜索sql为:SELECTFROMmy_hello_tableWHEREupdat
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Stella981 Stella981
2年前
PHP+jQuery寥寥几行代码轻松实现百度搜索那样的无刷新PJAX的分页列表和导航链接
!(https://static.oschina.net/uploads/space/2016/1208/171419_U00R_561214.png)PHP寥寥几行代码轻松实现百度搜索那样的分页列表和导航链接,某些语言的拥趸哭晕在厕所.<?php$apparray('db_prefix''