jpa 分页查询几种demo Example分页/ExampleMatcher/Specification分页/SQL分页
时间:2020-05-12
本文章向大家介绍jpa 分页查询几种demo Example分页/ExampleMatcher/Specification分页/SQL分页,主要包括jpa 分页查询几种demo Example分页/ExampleMatcher/Specification分页/SQL分页使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
以下都是基于spring-data-jpa2.1.8
1.单纯分页,没有条件
/*** * 直接用dao调用分页 */ @Test public void findPageDao1() { try { System.out.println("=============== findPage ================" ); //jpa 1.*写法 //Pageable pageable = new PageRequest(0,2, Sort.Direction.DESC,"userId");//sprint-data-common 2.0以下用这个 //jpa 0.*写法 1 //Sort sort=Sort.by(Sort.Direction.DESC,"userId"); //Pageable pageable = PageRequest.of(0, 2,sort); //jpa 0.*写法 2 Pageable pageable = PageRequest.of(0, 2, Sort.Direction.DESC,"userId");//一定要是model中的字段注意大小写,sprint-data-common 2.0以上用这个 Page<SysUser> pageList=sysUserDao.findAll(pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
2.(不推荐)使用findAll(example,pageable)Example/ExampleMatcher表达式分页 不支持 a=1 and (b=2 or c=3)这样的逻辑 https://stackoverflow.com/questions/42584191/spring-query-by-example-using-or
/*** * (不推荐)直接用dao调用分页带条件 Example<S> 不支持 a=1 and (b=2 or c=3)这样的逻辑 https://stackoverflow.com/questions/42584191/spring-query-by-example-using-or */ @Test public void findPageDao2() { try { System.out.println("=============== findPage ================" ); Sort sort = new Sort(Sort.Direction.DESC, "userId"); //分页 int page=1;//第几页 int pageSize=2;//每页条数 //Pageable pageable = new PageRequest(page - 1, pageSize, sort);//已过时 Pageable pageable = PageRequest.of(page - 1, pageSize, sort); //多条件 account='test' and username='zw' SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw"); ExampleMatcher matcher = ExampleMatcher.matching() .withMatcher("account", ExampleMatcher.GenericPropertyMatchers.contains()) .withMatcher("userName", ExampleMatcher.GenericPropertyMatchers.contains());//like Example<SysUser> example = Example.of(entity,matcher); //Example<SysUser> example = Example.of(entity); Page<SysUser> pageList= sysUserDao.findAll(example,pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
3.使用Specification,功能比较强大,可以实现常用的条件功能 Specification使用说明请参考:https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/domain/Specification.html
/*** * 直接用dao调用分页带条件 Specification<S> */ @Test public void findPageDao3() { try { System.out.println("=============== findPage ================" ); Sort sort = new Sort(Sort.Direction.DESC, "userId"); //分页 int page=1;//第几页 int pageSize=2;//每页条数 //Pageable pageable = new PageRequest(page - 1, pageSize, sort);//已过时 Pageable pageable = PageRequest.of(page - 1, pageSize, sort); //多条件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); Specification<SysUser> spec=new Specification<SysUser>(){ @Override public Predicate toPredicate(Root<SysUser> root, CriteriaQuery<?> query, CriteriaBuilder cb) { Predicate p1 = cb.equal(root.get("account"), entity.getAccount()); Predicate p2 = cb.equal(root.get("userName"), entity.getUserName()); return cb.or(p1,p2); } }; Page<SysUser> pageList= sysUserDao.findAll(spec,pageable); if(pageList!=null && pageList.getTotalPages()>0){ System.out.println("page list:" ); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
4.自己写SQL条件返回List<Model>,这个最灵活可以随意写自己的SQL
/*** * 直接用dao调用分页带条件返回List<Model> 直接用SQL */ @Test public void findPageDao4() { try { System.out.println("=============== findPage ================" ); //分页 int page=1;//第几页 int pageSize=2;//每页条数 //多条件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); //查总数sql String sqlCount="select count(*) from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; //查分页的数据 String sql="select * from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; Query queryCount = sysUserService.getEntityManager().createNativeQuery(sqlCount); queryCount.setParameter("account", entity.getAccount()); queryCount.setParameter("userName", entity.getUserName()); Object count=queryCount.getSingleResult(); Integer listCount = count != null ? Integer.parseInt(count.toString()) : 0;//记录总数 Query query = sysUserService.getEntityManager().createNativeQuery(sql,SysUser.class);//指定Model query.setParameter("account", entity.getAccount()); query.setParameter("userName", entity.getUserName()); int offSet = PageUtil.getOffset(page, pageSize); query.setFirstResult(offSet).setMaxResults(pageSize); List<SysUser> pageList=query.getResultList(); if(pageList!=null && pageList.size()>0){ System.out.println("page list:" +pageList.size()); System.out.println("page Index:" +page+" item size :" +pageSize+" item Total :" +listCount); for(SysUser item:pageList){ System.out.println("userid: "+item.getUserId()+"__userAccount:"+item.getAccount()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
4.自己写SQL条件返回List<Map>,这个最灵活可以随意写自己的SQL
/*** * 直接用dao调用分页带条件返回List<Map> 直接用SQL */ @Test public void findPageDao5() { try { System.out.println("=============== findPage ================" ); //分页 int page=1;//第几页 int pageSize=2;//每页条数 //多条件 SysUser entity=new SysUser(); entity.setAccount("test"); entity.setUserName("zw1"); //查总数sql String sqlCount="select count(*) from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; //查分页的数据 String sql="select * from SYS_User where 1=1 and (account=:account or userName=:userName) Order by UserID desc "; Query queryCount = sysUserService.getEntityManager().createNativeQuery(sqlCount); queryCount.setParameter("account", entity.getAccount()); queryCount.setParameter("userName", entity.getUserName()); Object count=queryCount.getSingleResult(); Integer listCount = count != null ? Integer.parseInt(count.toString()) : 0;//记录总数 Query query = sysUserService.getEntityManager().createNativeQuery(sql);//这时只有sql query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);//添加这一行才能返回List<Map> query.setParameter("account", entity.getAccount()); query.setParameter("userName", entity.getUserName()); int offSet = PageUtil.getOffset(page, pageSize); query.setFirstResult(offSet).setMaxResults(pageSize); List<Map> pageList=query.getResultList(); if(pageList!=null && pageList.size()>0){ System.out.println("page list:" +pageList.size()); System.out.println("page Index:" +page+" item size :" +pageSize+" item Total :" +listCount); for(Map item:pageList){ System.out.println("userid: "+item.get("UserID").toString()+"__userAccount:"+item.get("Account").toString()); } }else { System.out.println("page is null:" ); } } catch (Exception e) { System.out.println("error:" +e.getMessage()); // e.printStackTrace(); } }
sysUserService代码
@PersistenceContext protected EntityManager em;// 类似hibernate session //给子类用的 public EntityManager getEntityManager() { return em; }
SysUserDao代码
@Repository public interface SysUserDao<SysUser,Integer> extends JpaRepository <T,ID>, JpaSpecificationExecutor<T> { }
原文地址:https://www.cnblogs.com/q149072205/p/12875771.html
- 如何养成良好的c++编程习惯(1)——内存管理
- 使用jOrgChart插件实现组织架构图的展示
- Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)
- webpack入门——webpack的安装与使用
- Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
- ELK5.0安装教程
- 替换空格
- JavaScript实现段落文本高亮
- 原生js实现简单移动端轮播图
- html5页面实现点击复制功能
- python生成式
- Elasticsearch——分词器对String的作用
- AR改变生活:远程AR辅助应用程序可以解决更多现实问题
- 常见排序算法分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Spring-Data-Redis 2.X以上版本使用心得和一些坑
- Java后端面试学习知识总结——数据库:MySQL
- Java 记一次自定义比较器中compareTo方法使用long强转int作为比较结果产生的bug
- SpringCloud 使用feign报错
- Java 使用Runtime在一个Java程序中启动和关闭另一个Java程序
- 解决虚拟机Centos7 报错 curl#56
- Java 桶排序实现 如何判断该放到哪个桶里
- Java selenium使用ChromeDriver截图 解决get超时后续任务报错问题
- 冒泡排序-排序算法
- Java中JDBC工具类封装
- 3.深入k8s:Deployment控制器
- 使用FreeSurfer进行脑区分割
- android 调试 adb
- Java实现基本数据结构(三)——队列
- Java实现基本数据结构(二)——栈