多表分页查询,强烈推荐原生sql

一般需要两个方法,一个查条数,一个查当前页数据

@Query(value = "" +"" +" select " +"a.id," +"a.title," +"a.article_abstract," +"a.author_id," +"a.like_count ," +"a.read_count," +"a.tags," +"a.create_time," +"a.update_time," +"a.type," +"a.`status` " +" from re_article_category rac " +"" +" left join  " +" article a " +"" +" on a.id=rac.article_id " +"" +" where rac.category_id= :catId" +" and a.status = :status limit :start,:size",nativeQuery = true)List<Object[]> pageByCatId(@Param("catId") Integer catId,@Param("status")String status,@Param("start")long start, @Param("size")int size);@Query(value = "select" +" count(a.id)" +" from re_article_category rac" +"" +" left join " +" article a" +"" +" on a.id=rac.article_id" +"" +" where rac.category_id= :catId" +" and a.status= :status",nativeQuery = true)Integer countByCat(@Param("catId") Integer catId,@Param("status") String status);

service 层转换:

    //根据分类获取所有文章@Overridepublic Result getPageByCatId(Integer catId, Integer limit, Integer pageNo) {PageRequest pageRequest = PageRequest.of(pageNo, limit);//借助计算起始位置int total=blogDao.countByCat(catId,BLOG_STATUS_NORMAL);// 计算数据总条数List<Object[]> records=blogDao.pageByCatId(catId,BLOG_STATUS_NORMAL,pageRequest.getOffset(),pageRequest.getPageSize());// 获取分页数据Page<Object[]> page =new Page<>(records,limit,pageNo,total);page.transferFromSqlList(BlogModel.class);// 转换分页数据到具体的java beanreturn Result.success(page);}
}

Page.java(自定义工具)


package com.blog.demo.common.util;import com.google.common.collect.Lists;
import org.springframework.data.domain.PageImpl;import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;/*** 与具体ORM实现无关的分页参数及查询结果封装.*  * * @param <T> Page中记录的类型.*
* @author eagler006 email:eagler006@hotmail.com
* @version  1.2*/
public class Page<T> {//-- 分页参数 --//protected int pageNo = 1;protected int pageSize = 15;protected int first =-1; //此处添加主要是为了方便分库分表时计算各表步进取值,当大于0时说明getFirst()函数不从pageNo计算获得protected boolean autoCount = true;protected String sort="id";protected String dir= "ASC";//-- 返回结果 --//protected List result = Lists.newArrayList();protected long totalCount = -1;//-- 构造函数 --//public Page() {}public Page(List<Object[]> data,int size,int pageNo,int totalCount){setPageNo(pageNo);setPageSize(size);setTotalCount(totalCount);setResult(data);}public Page(int pageSize) {this.pageSize = pageSize;}public void transferFromSqlList(Class clazz){List tResult = Lists.newArrayList();ArrayList<Object> objArr;for (Object objItem : result){try {objArr = new ArrayList<Object>(Arrays.asList((Object[]) objItem));Constructor<T> constructor = clazz.getDeclaredConstructor(objArr.getClass());tResult.add(constructor.newInstance(objArr));} catch (Exception e){e.printStackTrace();}}this.result = tResult;}public void copyPropertiesFromAnother(Page<?> page){this.pageNo = page.getPageNo();this.pageSize = page.getPageSize();this.first = page.getFirst();this.autoCount = page.isAutoCount();this.sort = page.getSort();this.dir = page.getDir();this.totalCount = page.getTotalCount();}//-- 访问查询参数函数 --///*** 获得当前页的页号,序号从1开始,默认为1.*/public int getPageNo() {return pageNo;}/*** 设置当前页的页号,序号从1开始,低于1时自动调整为1.*/public void setPageNo(final int pageNo) {this.pageNo = pageNo;if (pageNo < 1) {this.pageNo = 1;}}public Page<T> pageNo(final int thePageNo) {setPageNo(thePageNo);return this;}/*** 获得每页的记录数量,默认为1.*/public int getPageSize() {return pageSize;}/*** 设置每页的记录数量,低于1时自动调整为1.*/public void setPageSize(final int pageSize) {this.pageSize = pageSize;if (pageSize < 1) {this.pageSize = 1;}}public Page<T> pageSize(final int thePageSize) {setPageSize(thePageSize);return this;}/*** @return the sort*/public String getSort() {return sort;}/*** @param sort the sort to set*/public void setSort(String sort) {this.sort = sort;}/*** @return the dir*/public String getDir() {return dir;}/*** @param dir the dir to set*/public void setDir(String dir) {this.dir = dir;}/*** 根据pageNo和pageSize计算当前页第一条记录在总结果集中的位置,序号从1开始.*/public int getFirst() {if(this.first>0)return first;return ((pageNo - 1) * pageSize) + 1;}/*** @param first the first to set*/public void setFirst(int first) {this.first = first;}/*** 查询对象时是否自动另外执行count查询获取总记录数, 默认为false.*/public boolean isAutoCount() {return autoCount;}/*** 查询对象时是否自动另外执行count查询获取总记录数.*/public void setAutoCount(final boolean autoCount) {this.autoCount = autoCount;}public Page<T> autoCount(final boolean theAutoCount) {setAutoCount(theAutoCount);return this;}//-- 访问查询结果函数 --///*** 取得页内的记录列表.*/public List getResult() {return result;}/*** 设置页内的记录列表.*/public void setResult(final List result) {this.result = result;}/*** 取得总记录数, 默认值为-1.*/public long getTotalCount() {return totalCount;}/*** 设置总记录数.*/public void setTotalCount(final long totalCount) {this.totalCount = totalCount;}/*** 根据pageSize与totalCount计算总页数, 默认值为-1.*/public long getTotalPages() {if (totalCount < 0) {return -1;}long count = totalCount / pageSize;if (totalCount % pageSize > 0) {count++;}return count;}/*** 是否还有下一页.*/public boolean isHasNext() {return (pageNo + 1 <= getTotalPages());}/*** 取得下页的页号, 序号从1开始.* 当前页为尾页时仍返回尾页序号.*/public int getNextPage() {if (isHasNext()) {return pageNo + 1;} else {return pageNo;}}/*** 是否还有上一页.*/public boolean isHasPre() {return (pageNo - 1 >= 1);}/*** 取得上页的页号, 序号从1开始.* 当前页为首页时返回首页序号.*/public int getPrePage() {if (isHasPre()) {return pageNo - 1;} else {return pageNo;}}
}

效果:

{"code": 0,"msg": "success","data": {"pageNo": 1,"pageSize": 10,"first": 1,"autoCount": true,"sort": "id","dir": "ASC","result": [{"id": 73,"title": "标题","content": null,"articleAbstract": "这是简介,请勿惊讶?","tags": "string","type": "1","readCount": null,"likeCount": 1,"status": "0","createTime": "2019-06-06T04:32:01.000+0000","updateTime": "2019-06-06T04:32:01.000+0000","categoryId": null},{"id": 107,"title": "正式文章","content": null,"articleAbstract": "发布一篇文章","tags": "string","type": "0","readCount": 0,"likeCount": 1,"status": "0","createTime": "2019-06-06T10:32:11.000+0000","updateTime": "2019-06-06T10:32:11.000+0000","categoryId": null}],"totalCount": 2,"prePage": 1,"hasNext": false,"nextPage": 1,"hasPre": false,"totalPages": 1}
}

完美的 jpa 多表 原生sql 分页查询相关推荐

  1. 记一次SpringDateJpa 使用原生sql 分页查询

    jpa 如果使用原生sql如何分页查询呢? @GetMapping("/getInfo")public Result getOpenId() throws Exception{Si ...

  2. php 原生sql 分页查询,Laravel框架执行原生SQL语句及使用paginate分页的方法

    本文实例讲述了Laravel框架执行原生SQL语句及使用paginate分页的方法.分享给大家供大家参考,具体如下: 1.运行原生sql public function getList($data){ ...

  3. Spring JPA自定义SQL分页查询

    JPA自定义SQL分页查询 [存在的问题] 在使用Spring JPA原生SQL进行分页查询时存在如下问题: 1.使用List转Page工具类导致查询速度较慢,原因在于先把所有数据查询出来返回成Lis ...

  4. jpa mysql sql分页查询语句_jpa 中 Query 的分页查询和更新

    1,查询分页 注意这个地方nativeQuery=true 代表的是可执行原生sql 先查询出来所有的数据,然后再差个总条数 返回page @Query(nativeQuery = true, val ...

  5. 分页offset格式_Thinkphp5 原生sql分页操作

    一.问题描述:我们用Thinkphp5开发功能的时候框架自带的查询方法不太好使用类似于连接查询和复制的sql语句,这是我们就需要用到原生sql语句查询数据.但是使用原生sql语句查询的方式就无法使用框 ...

  6. SQL分页查询方案的性能对比

    作者 | 中国农业银行 吴海存 责编 | 晋兆雨 头图 | CSDN下载自视觉中国 导读 本文主要介绍了基于ROWNUM.主键列/非空唯一性列.分析函数.OFFSET-FETCH NEXT机制的几种S ...

  7. spring data jpa实现有条件的分页查询功能

    spring data jpa实现有条件的分页查询功能 前端部分代码.发送请求: $('#grid').datagrid({iconCls: 'icon-forward',fit: true,bord ...

  8. thinkphp5基本的一些操作/API友好/获取请求信息(Request)/判断请求类型(GET...)/验证参数数据(Validate)/连接数据库/原生sql语句查询

    文章目录 一.API友好 1.举两个thinkphp5关于API友好的例子 (1)数据输出 (2)错误调试Trace 二.获取请求信息(Request) 1.获取URL信息 2.获取 模块/控制器/操 ...

  9. SQL 分页查询语句大全即(查找第N到M条记录的方法)

    SQL 分页查询语句大全即(查找第N到M条记录的方法) 第一种方法,我的原创方法 row=2 表示分页行数 page=1 表示页码 getnum=row*page select * from  (se ...

最新文章

  1. DirectShowPlayerService::doRender: Unresolved error code 0x80040266 (IDispatch error #102)
  2. 有一天老板和我要几个关键数据……
  3. 【XAudio2】1.XAudio2 介绍
  4. seach和seachd的区别
  5. java work stealing_Java线程池之WorkStealingPool,任务窃取算法
  6. jays+android耳机,android – 响应多按钮有线耳机
  7. Web开发人员应当知道的15个开源项目
  8. 前端开发使用的 安卓模拟器_抖音有电脑版或者网页版吗?如何在电脑上使用抖音?...
  9. python 函数特殊属性
  10. 游戏中的镜头语言和应用
  11. 大人物只认得大人物……
  12. python乱码系列1
  13. js强制保留两位小数
  14. AES256-GCM-NOPADDING加密解密(java)
  15. Linux 端口号占用如何处理
  16. XPS 关闭 电源警告
  17. 什么是窄带物联网(NB-IoT)?
  18. 求2+22+222+2222+···+22···22(n个2精确计算)
  19. 三坐标检测之测头校验的原理
  20. Arbitrary Style Transfer in Real-time with Adaptive Instance Normalization论文阅读笔记

热门文章

  1. 企业微信机器人?用Python,几行代码搞定!
  2. mysql建立班级表_MySQL创建表与表之间的联系
  3. 移除设备和驱动器的WPS网盘图标,亲测有效,不在恢复
  4. 我们都是被选中的孩子
  5. 俄罗斯套娃信封问题【python实现】
  6. 平方数 (sdut oj)
  7. Win10运行正当防卫2(Just Cause 2),出现“DXGI_ERROR_NOT_FOUND”错误的解决办法。
  8. 为什么很多初创互联网公司要组建自己的技术团队,而不是选择外包?
  9. 蓝桥杯 单片机 独立按键 的使用
  10. layui让当前页面刷新_layui怎么刷新当前页面