jpa mysql sql分页查询语句_JPA分页查询与条件分页查询

情有独钟的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 是一个接口,提供了分页一组方法的声明,如第几页,每页多少条记录,排序信息等,部分方法如下:

intgetPageNumber();

intgetPageSize();

intgetOffset();

Sort getSort();

Pageable next();

Pageable previousOrFirst();

Pageable first();

booleanhasPrevious();

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

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

1. impl

@Override

publicPage findByCondition(VideoCategory videoCategory, SearchVo searchVo, Pageable pageable) {

return videoCategoryDao.findAll(new Specification() {

@Nullable

@Override

publicPredicate toPredicate(Root root, CriteriaQuery> cq, CriteriaBuilder cb) {

// 可添加你的其他搜索过滤条件 默认已有创建时间过滤

Path createTimeField=root.get("createTime");

Path categoryIdField=root.get("categoryId");

List list = newArrayList();

//创建时间

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 = newPredicate[list.size()];

cq.where(list.toArray(arr));

returnnull;

}

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

publicstaticPageable 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值