情有独钟的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 即可,同样也提供给了我们分页查询的方法:
举例:
PagefindByCondition(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 PagefindByCondition(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://img2018.cnblogs.com/blog/1104426/201903/1104426-20190317205145060-1627092390.jpg)