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

情有独钟的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 即可,同样也提供给了我们分页查询的方法:

举例:

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;    }

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

原文地址:https://www.cnblogs.com/niceyoo/p/10817290.html

时间: 2024-11-08 15:55:23

JPA分页查询与条件分页查询的相关文章

MYSQL复杂查询(条件不定查询+按降序/升序分页显示)

使用mybatis框架后,mybatis-generator可以为我们自动生成操作数据库(MYSQL)的*Mapper.xml文件+模型类+*Mapper接口,但是,mybatis-generator并不能为我们生成所有方法,例如根据输入的不定条件来查询数据,又比如按照某个参数升序或者降序并分页显示所查到的数据,下面介绍一下条件不定查询及按降序/升序分页显示的方法. 1.按条件不定查询(项目基于SSMM(spring+springmvc+maven+mybatis)框架整合的代码进行举例) 在B

使用ArcGIS API for Silverlight 进行复合多条件空间查询

原文:使用ArcGIS API for Silverlight 进行复合多条件空间查询 这两天帮网上认识的一个兄弟做了一个查询的示例,多多少少总结一下,在此和大家分享. 为什么说是复合多条件呢?因为进行空间查询有时候我们查询的条件会很复杂,比如要求某一要素的某一属性大于多少,且小于多少,且又不等于多少等等.而在官网给出的例子中并没有关于复合查询的说明.不过查看API后,你会发现一句很重要的话: A where clause for the query. Any legal SQL where c

bos 第4 (区域excel批量导入、区域通用分页查询、分区的添加、分区多条件分页查询、分区导出excel)

BOS项目笔记 第4天 今天内容安排: 1.区域批量导入功能 jQuery OCUpload(一键上传插件).apache POI.pinyin4j 2.实现区域的分页查询 3.对分页代码重构 4.添加分区(combobox下拉框) 5.分区的组合条件分页查询 6.分区数据导出功能 1. 区域数据批量导入功能 1.1 一键上传插件使用 ajax不能做文件上传. 第一步:在jsp页面中引入插件的js文件 <script type="text/javascript" src=&quo

EasyUi+Spring Data 实现按条件分页查询

Spring data 介绍 Spring data 出现目的 为了简化.统一 持久层 各种实现技术 API ,所以 spring data 提供一套标准 API 和 不同持久层整合技术实现 . 自己开发 Repository 只需要继承 JpaRepository 接口CrudRepository save. delete. deteleAll. findAll. findOne. countPagingAndSortingRepositoryfindAll(Sort) 基于排序的查询. fi

分页和多条件查询功能

/** * 辅助拼接HQL语句的工具类 * @author G-Xia * */ public class QueryHelper { private String fromClause; // From子句 private String whereClause = ""; // Where子句 private String orderByClause = ""; // OrderBy子句 private List<Object> parameters

框架 day50 BOS项目 4 批量导入(ocupload插件,pinyin4J)/POI解析Excel/Combobox下拉框/分区组合条件分页查询(ajax)/分区数据导出(Excel)

知识点: 批量导入(ocupload插件,pinyin4J /POI解析Excel(apache POI) /区域分页查询 /Combobox下拉框 /分区组合条件分页查询(ajax) /分区数据导出(Excel下载) BOS项目笔记第4天 1.    区域批量导入功能 *Ajax不支持文件上传. *上传并且不刷新上传页面原理: Target到一个0,0,0的隐藏iframe里,造成一个没有刷新的假象 <form target="myIframe" action="ab

MVC+Bootstrap+Drapper使用PagedList.Mvc支持多查询条件分页

前几天做一个小小小项目,使用了MVC+Bootstrap,以前做分页都是异步加载Mvc部分视图的方式,因为这个是小项目,就随便一点.一般的列表页面,少不了有查询条件,下面分享下Drapper+PagedList.Mvc支持多查询条件分页的使用经验. 在MVC中我们一般习惯使用强类型Model,通过分析Orders的展示页面,来构建这个Model. 1.查询参数的Model public class OrderQueryParamModel { /// <summary> /// 订单编号 //

用js实现表格多条件模糊查询,可兼容分页

需求如下: 实现姓名.职位.直属上级.用户类型四个条件模糊查询,查询到的结果分页展示. 实现逻辑: 定义两个数组,其中vm.nowallUserLists为原始数据.vm.nowallUserFilter为筛选后数据.最终循环vm.nowallUserFilter来渲染表格. 筛选前,将vm.nowallUserLists的值赋给vm.nowallUserFilter,表格渲染全部数据. 筛选时,先初始化vm.nowallUserFilter为空数组,将筛选得到的内容推到这个数组中.此时表格渲染

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询

-- 数据的准备 -- 创建一个数据库 create database python_test charset=utf8; -- 使用一个数据库 use python_test; -- 显示使用的当前数据是哪个? select database(); -- 创建一个数据表 -- students表 create table students( id int unsigned primary key auto_increment not null, name varchar(20) default