long mode 分页_在Spring Boot中使用Spring-data-jpa实现分页查询(转)

在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式。

1、引入起步依赖

org.springframework.boot

spring-boot-starter-web

org.springframework.boot

spring-boot-starter-thymeleaf

org.springframework.boot

spring-boot-starter-data-jpa

2、对thymeleaf和jpa进行配置

打开application.yml,添加以下参数,以下配置在之前的文章中介绍过,此处不做过多说明

spring:

thymeleaf:

cache:truecheck-template-location: truecontent-type: text/html

enabled:trueencoding: utf-8mode: HTML5

prefix: classpath:/templates/suffix: .html

excluded-view-names:

template-resolver-order:

datasource:

driver-class-name: com.mysql.jdbc.Driver

url: jdbc:mysql://localhost:3306/restful?useUnicode=true&characterEncoding=UTF-8&useSSL=false

username: root

password: root

initialize:trueinit-db: truejpa:

database: mysql

show-sql: truehibernate:

ddl-auto: update

naming:

strategy: org.hibernate.cfg.ImprovedNamingStrategy

3、编写实体Bean

@Entity

@Table(name="book")

public class Book {

@Id

@GeneratedValue(strategy = GenerationType.IDENTITY)

@Column(name = "id", updatable = false)

private Long id;

@Column(nullable = false,name = "name")

private String name;

@Column(nullable = false,name = "isbn")

private String isbn;

@Column(nullable = false,name = "author")

private String author;

public Book (String name,String isbn,String author){

this.name = name;

this.isbn = isbn;

this.author = author;

}

public Book(){

}

//此处省去get、set方法

}

public class BookQuery {

private String name;

private String isbn;

private String author;

//此处省去get、set方法

}

4、编写Repository接口

@Repository("bookRepository")

public interface BookRepository extends JpaRepository

,JpaSpecificationExecutor {

}

此处继承了两个接口,后续会介绍为何会继承这两个接口

5、抽象service层

首先抽象出接口

public interface BookQueryService {

Page findBookNoCriteria(Integer page,Integer size);

Page findBookCriteria(Integer page,Integer size,BookQuery bookQuery);

}

实现接口

@Service(value="https://my.oschina.net/wangxincj/blog/bookQueryService")

public class BookQueryServiceImpl implements BookQueryService {

@Resource

BookRepository bookRepository;

@Override

public Page findBookNoCriteria(Integer page,Integer size) {

Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");

return bookRepository.findAll(pageable);

}

@Override

public Page findBookCriteria(Integer page, Integer size, final BookQuery bookQuery) {

Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");

Page bookPage = bookRepository.findAll(new Specification(){

@Override

public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {

List list = new ArrayList();

if(null!=bookQuery.getName()&&!"".equals(bookQuery.getName())){

list.add(criteriaBuilder.equal(root.get("name").as(String.class), bookQuery.getName()));

}

if(null!=bookQuery.getIsbn()&&!"".equals(bookQuery.getIsbn())){

list.add(criteriaBuilder.equal(root.get("isbn").as(String.class), bookQuery.getIsbn()));

}

if(null!=bookQuery.getAuthor()&&!"".equals(bookQuery.getAuthor())){

list.add(criteriaBuilder.equal(root.get("author").as(String.class), bookQuery.getAuthor()));

}

Predicate[] p = new Predicate[list.size()];

return criteriaBuilder.and(list.toArray(p));

}

},pageable);

return bookPage;

}

}

此处我定义了两个接口,findBookNoCriteria是不带查询条件的,findBookCriteria是带查询条件的。在此处介绍一下上面提到的自定义Repository继承的两个接口,如果你的查询列表是没有查询条件,只是列表展示和分页,只需继承JpaRepository接口即可,但是如果你的查询列表是带有多个查询条件的话则需要继承JpaSpecificationExecutor接口,这个接口里面定义的多条件查询的方法。当然不管继承哪个接口,当你做分页查询时,都是需要调用findAll方法的,这个方法是jap定义好的分页查询方法。

findBookCriteria方法也可以使用以下方法实现,大家可以自行选择

@Override

public Page findBookCriteria(Integer page, Integer size, final BookQuery bookQuery) {

Pageable pageable = new PageRequest(page, size, Sort.Direction.ASC, "id");

Page bookPage = bookRepository.findAll(new Specification(){

@Override

public Predicate toPredicate(Root root, CriteriaQuery> query, CriteriaBuilder criteriaBuilder) {

Predicate p1 = criteriaBuilder.equal(root.get("name").as(String.class), bookQuery.getName());

Predicate p2 = criteriaBuilder.equal(root.get("isbn").as(String.class), bookQuery.getIsbn());

Predicate p3 = criteriaBuilder.equal(root.get("author").as(String.class), bookQuery.getAuthor());

query.where(criteriaBuilder.and(p1,p2,p3));

return query.getRestriction();

}

},pageable);

return bookPage;

}

6、编写Controller

针对有查询条件和无查询条件,我们分别编写一个Controller,默认每页显示5条,如下

@Controller

@RequestMapping(value = "https://my.oschina.net/queryBook")

public class BookController {

@Autowired

BookQueryService bookQueryService;

@RequestMapping("/findBookNoQuery")

public String findBookNoQuery(ModelMap modelMap,@RequestParam(value = "https://my.oschina.net/wangxincj/blog/page", defaultValue = "https://my.oschina.net/wangxincj/blog/0") Integer page,

@RequestParam(value = "https://my.oschina.net/wangxincj/blog/size", defaultValue = "https://my.oschina.net/wangxincj/blog/5") Integer size){

Page datas = bookQueryService.findBookNoCriteria(page, size);

modelMap.addAttribute("datas", datas);

return "index1";

}

@RequestMapping(value = "https://my.oschina.net/findBookQuery",method = {RequestMethod.GET,RequestMethod.POST})

public String findBookQuery(ModelMap modelMap, @RequestParam(value = "https://my.oschina.net/wangxincj/blog/page", defaultValue = "https://my.oschina.net/wangxincj/blog/0") Integer page,

@RequestParam(value = "https://my.oschina.net/wangxincj/blog/size", defaultValue = "https://my.oschina.net/wangxincj/blog/5") Integer size, BookQuery bookQuery){

Page datas = bookQueryService.findBookCriteria(page, size,bookQuery);

modelMap.addAttribute("datas", datas);

return "index2";

}

}

7、编写页面

首先我们编写一个通用的分页页面,新建一个叫page.html的页面

xmlns:th="http://www.thymeleaf.org"

xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"

layout:decorator="page">

  • 首页
  • 上一页
${pageNumber}
下一页尾页

针对无查询条件的接口,创建一个名为index1.html的页面并引入之前写好的分页页面,如下

Title

IDnameisbnauthor

${obj.id}${obj.name}${obj.isbn}${obj.author}

针对有查询条件的接口,创建一个名为index2.html的页面并引入之前写好的分页页面,如下

Title
name isbn
author
查询
IDnameisbnauthor
${obj.id}${obj.name}${obj.isbn}${obj.author}

ok!代码都已经完成,我们将项目启动起来,看一下效果。大家可以往数据库中批量插入一些数据,访问http://localhost:8080/queryBook/findBookNoQuery,显示如下页面

访问http://localhost:8080/queryBook/findBookQuery,显示页面如下,可以输入查询条件进行带条件的分页查询:

ok!以上便是一个简单的jap分页查询功能的实现。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/503459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小学计算机课程评价,小学信息技术课堂评价浅谈

小学信息技术是一门融知识性、趣味性和技能性于一体的学科,它着重于对小学生进行初步的信息意识、信息素养和信息技能的培养,集知识性和技能性于一体。而对于学生学习情况的评价,信息技术学科不像其他学科一样,可以留有课后作业或…

git 相同commit_Git 合并多次 commit 、 删除某次 commit

Git 合并多次 commit有时候在一个分支的多次意义相近的 commit,会把整个提交历史搞得很混乱,此时可以将一部分的 commit 合并为一个 commit,以美化整个 commit 历史,可以使用 rebase 的方法来合并多次 commit,主要步骤…

微服务 松耦合_超值干货:微服务架构下如何解耦,对于已经紧耦合下如何重构?...

今天准备谈下微服务架构下各个微服务间如何解耦,以及对于已经紧耦合的微服务如何进行重构。要明白实际上微服务后续出现的诸多问题往往都是一开始微服务模块划分就不合理导致,对于具体的模块划分方法和原则,我总结出了以下几点。原则1&#x…

西安电子科技大学研究生计算机专业王宇平教授学生就业岗位,西安电子科技大学计算机学院导师信息情况...

研究生考试招生以下是所有导师的详细资料姓名 权义宁 杨世勇 刘志镜 冯大政 王宇平 王宇平 马建峰职称 副教授 副教授 教授 教授 教授 教授 教授导师类别 硕士生导师 硕士生导师 博士生导师 博士生导师 博士生导师 硕士生导师 博士生导师电子信箱ynquanhttp://doc.xuehai.netsh…

增量式pid调节方式有何优点_增量式pid和位置式pid相比各有什么优缺点

展开全部位置PID和增量PID之间的差异是不同的输出,是否存在积分部分以及是否具有记忆功62616964757a686964616fe78988e69d8331333433626562能。1.输出不同:位置PID控制的输出与整个过去状态有关,并且使用了误差的累加值;而增量PID…

文件夹 计算机无法使用,电脑文件夹提示被使用无法删除怎么办

相信有朋友碰到过这样的问题,电脑上新建一个临时文件夹在使用完后进行删除,或者卸载某一个程序,在卸载完想手动删除残留的文件夹时,出现了下图所示的提示:这个时候我们一般都会在任务管理器中查找是哪个进程占用了&…

python之异常处理_Python之异常处理

异常对象请大家运行如下代码a 100/0print(a)就会发现解释器显示如下的错误提示Traceback (most recent call last): File "xxxxxxxxxx.py", line 1, in a 100/0ZeroDivisionError: division by zero大家要学会看解释器的报错。这就是解释器向我们报告, …

西安北苑附近哪有计算机学校,太古城北(北苑地铁站)附近大学院校

最佳答案:太古城北(北苑地铁站)附近有长安大学-团委,长安大学渭水校区,长安大学计算机实验教学中心,陕西科技大学化学与化工学院,陕西科技大学实验楼1A,陕西科技大学实验楼2A,陕西科技大学-工程训练中心,陕西科技大学管理学院,陕西科技大学西安校区,陕西科技大学信息…

http://www.od85c.com.cn/html/,OllyDbg script for unpacking Enigma 4.xx and 5.xx

[Asm] 纯文本查看 复制代码// Enigma Protector 4.xx and 5.XX unpacker by GIV (some parts are from LCF-AT Alternativ 1.1 script and the API fix is from SHADOW_UA script)// January 22 2016// givreversing.ro// PRIVATE// 3D00F000007E13B800000100 - API COMPARE AN…

hive 神盾特工局_《神盾局特工》第三季剧终惊人:两位超高人气的角色离开

原标题:《神盾局特工》第三季剧终惊人:两位超高人气的角色离开当“神盾局特工”几周前宣布一位主要角色将在本季最后一集中死亡时,粉丝开始猜测这个角色将会是谁。当一切真相揭开时,此剧对于“升天”这个词的承诺竟然有双重意义,第…

计算机软件著作权特征,计算机软件著作权的法律特征是什么

计算机软件著作权的法律特征是什么一、权利内容的法定性法定性有狭义、广义之分。作为一个法律概念的“权利”,都是由国家的法律所规定的,不存在任何法律规定之外的权利,譬如没有所谓“天赋”的权利。从这个意义上讲,凡法律上的权…

html img和背景图处理图片不拉伸_css 背景图不拉伸自适应屏幕大小

效果图全屏:背景图尺寸大于屏幕尺寸,背景图只显示跟屏幕一样大小内容小屏时:如效果图所示,图片并没有发生压缩、或者缩小比例,它只是显示跟屏幕尺寸大小的内容,至于如何控制缩小浏览器时图片的变化&#xf…

2017计算机基本配置检测表,2017整理如何查看电脑的硬件配置信息?查看电脑硬件配.ppt...

2017整理如何查看电脑的硬件配置信息?查看电脑硬件配如何查看电脑的硬件配置信息?查看电脑硬件配 如何查看电脑的硬件配置信息?查看电脑硬件配置信息的方法 电脑培训 n9byl电脑的配置如何看呢?很多没有什么电脑基础的人是一个大的问题,有不少…

棒棒糖球球机器人_球球大作战刷棒棒糖_球球大作战刷龙蛋攻略

玩过球球大作战的玩家们都知道我们要获得棒棒糖和龙蛋是很不容易的,那么游戏中我们要怎么免费获得龙蛋和棒棒糖呢,而通过怎么才能快速获得龙蛋和棒棒糖,同时通过刷的方式要怎么操作呢,接下来就由小编一起来详细给大家介绍吧。游戏…

计算机二级web考点,2018年计算机二级考试WEB考点:web应用程序状态管理方式

2017年计算机等级考试已经结束,出国留学网为考生们整理了2018年计算机二级考试WEB考点,希望能帮到大家,想了解更多资讯,请关注我们,小编会及时更新哦。2018年计算机二级考试WEB考点:web应用程序状态管理方式…

mac笔记本怎么外接显示屏_win to go的安装与Macbook pro外接eGPU开启

更新:wintogo中eGPU的驱动(针对15.6 MacBook pro,且只针对于mantiz这款显卡坞) 在不插入显卡的情况下,安装 win to go将 Windows 10升级 ⾄预览版 ,并完成所有Windows 10 更新,之后禁用windows更…

中职计算机教学工作随笔,教学随笔(精选15篇)

教学随笔(精选15篇)教学是教师的教和学生的学所组成的一种人类特有的人才培养活动。下面和小编一起来看教育教学随笔(精选15篇),希望有所帮助!教学随笔 篇1今天是我的早读,到学校了,小朋友还没有静下来读书。我挥手让小朋友们静下…

array 前端面试题_web前端开发面试题汇总

前端面试题汇总第一部分HTML&CSS1. 浏览器分类浏览器:IE,Chrome,FireFox,Safari,Opera。内核:Trident,Gecko,Presto,Webkit。2.行内元素和块级元素行内元素&#xff…

一个男的和计算机对话,父与子的对话:计算机算法

上一封信我提到了电脑必须有三样要素:输入、输出和算法。算法是最核心的部分。没有算法,电脑不会知道你的输入究竟该返回什么样的输出。你 最近数学期中考考得相当不错,你应该注意到,“应用题”这种题目,本质上考的就是…

python3编程入门先学什么_自学编程入门,先学什么语言好?

先说结论吧: 其实任何一个你能持之以恒学习的编程语言都行,但我会建议从 HTML,CSS 和 Python 开始入门。原因如下:学习编程就像学骑自行车,对新手来说最重要的是持之以恒的练习。那如何持之以恒呢?我建议从三方面考虑这个问题:选择…