博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JPA分页查询与条件分页查询
阅读量:7060 次
发布时间:2019-06-28

本文共 4039 字,大约阅读时间需要 13 分钟。

情有独钟的JPA

平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~

在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查询以及查询列表分页呢?

关于JPA的使用

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

1、导入依赖
    
org.springframework.boot
    
spring-boot-starter-data-jpa
    mysql、web、druid......
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 即可,同样也提供给了我们分页查询的方法:

举例:

Page
 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
 findByCondition(VideoCategory videoCategory, SearchVo searchVo, Pageable pageable) {
        return videoCategoryDao.findAll(new Specification
() {
            @Nullable             @Override             public Predicate toPredicate(Root
 root, CriteriaQuery
 cq, CriteriaBuilder cb) {
                // 可添加你的其他搜索过滤条件 默认已有创建时间过滤                 Path
 createTimeField=root.get("createTime");                 Path
 categoryIdField=root.get("categoryId");                 List
 list = new ArrayList
();                 //创建时间                 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
> getByCondition(             @ModelAttribute VideoCategory videoCategory,             @ModelAttribute SearchVo searchVo,             @ModelAttribute PageVo pageVo){
        Page
 page = videoCategoryService.findByCondition(videoCategory, searchVo, PageUtil.initPage(pageVo));         return new ResultUtil
>().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;     }

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

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

你可能感兴趣的文章
H5页面快速搭建之高级字体应用实践
查看>>
centos6.5、centos6.6修改ssh默认端口号
查看>>
文本文件和二进制文件
查看>>
轻量级smurf源码
查看>>
Python数据类型-类功能详解--【列表】
查看>>
Exchange 2003迁移系统助理邮箱
查看>>
linux下桌面环境的介绍及VNC的使用
查看>>
上位机与单片机通信开发总结
查看>>
信息系统项目管理师考试心得
查看>>
异步等待的 Python 协程
查看>>
jdk1.7 64位下载安装及环境配置
查看>>
hive本地安装
查看>>
深浅拷贝——string
查看>>
主从复制模式下跳过错误
查看>>
剑指offer17
查看>>
samba文件共享
查看>>
MySQL专题7之MySQL连接、 MySQL MULL值得处理以及MySQL 正则表达式的使用
查看>>
第二次作业
查看>>
web报表轻松实现数据异常预警功能
查看>>
ASP.NET Core之跨平台的实时性能监控
查看>>