【JPA】Spring Data JPA 实现分页和条件查询
1、在Repository层继承两个接口
- JpaRepository<Admin, Integer> 泛型参数:1.要查询的实体(Entity),2.这个实体的主键类型
- JpaSpecificationExecutor 泛型参数:要查的实体
@Repository
public interface AdminRepository extends JpaRepository<Admin, Integer>, JpaSpecificationExecutor<Admin> {
}
2、在Service层进行查询操作
Query 是自定义的一个类,放着查询的条件
public Page<Book> findByPage(Query query) {
//1.设置Page信息,参数1:当前页(下标从0开始),参数2:每页显示的个数
PageRequest pageRequest = PageRequest.of(query.getPageNum() - 1, query.getPageSize());
/**
* 2.设置查询条件,实现
*/
Specification<Book> specification = new Specification<Book>() {
@Override
public Predicate toPredicate(Root<Book> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder cb) {
//用于暂时存放查询条件,存放到查询条件List中
ArrayList<Predicate> predicateList = new ArrayList<>();
//第一个条件 like 语句
if (!StringUtils.isEmpty(query.getName())) {
Predicate name = cb.like(root.get("name"), "%" + query.getName() + "%");
predicateList.add(name);
}
//第二个条件 like 语句
if (!StringUtils.isEmpty(query.getAuthor())) {
Predicate author = cb.like(root.get("author"), "%" + query.getAuthor() + "%");
predicateList.add(author);
}
//第三个条件 like 语句
if (!StringUtils.isEmpty(query.getPublishHouse())) {
Predicate publishHouse = cb.like(root.get("publishHouse"), "%" + query.getPublishHouse() + "%");
predicateList.add(publishHouse);
}
//第四个条件 like 语句
if (!StringUtils.isEmpty(query.getType())) {
Predicate type = cb.like(root.get("type"), "%" + query.getType() + "%");
predicateList.add(type);
}
//第五个语句 between 语句
if (query.getMinPrice() < query.getMaxPrice()) {
//库中的 price 在getMinPrice 和 getMaxPrice 之间
Predicate price = cb.between(root.get("price"), query.getMinPrice(), query.getMaxPrice());
predicateList.add(price);
}
//第六个语句 大于等于
if (query.getMinPrice() == 0 && query.getMaxPrice() == 0) {
// 库中的 price >=getMinPrice()
Predicate greaterEqual = cb.greaterThanOrEqualTo(root.get("price"), query.getMinPrice());
predicateList.add(greaterEqual);
}
//条件语句都已经装到了 predicateList 集合里面 ,然后把这个类型的集合转为这个类型的数组
Predicate[] predicates = new Predicate[predicateList.size()];
//条件之间 OR 运算或and运算
if ("or".equals(query.getSharpness())) {
//这个是数组中的所有条件之间进行的是 或 运算
return cb.or(predicateList.toArray(predicates));
} else {
//这个是数组中的所有条件之间进行的是 与 运算
return cb.and(predicateList.toArray(predicates));
}
}
};
//使用 findAll 方法,第一个参数:条件的信息,第二个参数:分页信息
//注意:这个方法必须要让bookRepository接口继承 JpaSpecificationExecutor接口(上面说的第二个)
Page<Book> page = bookRepository.findAll(specification, pageRequest);
//返回page对象
return page;
}
3、Page的方法
//从Controller层调用Service层的方法,拿到Page对象
Page<Book> page = bookService.findByPage(query);
//判断是否找到了实体
boolean b = page.hasContent();
//返回装着实体的List集合
List<Book> content = page.getContent();
//符合条件的条数(不是数据库所有的条数,也不是当前页的条数)
long totalElements = page.getTotalElements();
//总页数
int totalPages = page.getTotalPages();
【JPA】Spring Data JPA 实现分页和条件查询的更多相关文章
- JPA && Spring Data && Spring Data JPA
1.JPA Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...
- 干货|一文读懂 Spring Data Jpa!
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...
- spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)
前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...
- Spring Boot2 系列教程(二十三)理解 Spring Data Jpa
有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring ...
- Spring Data Jpa 入门学习
本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...
- 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?
目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...
- SpringBoot入门:Spring Data JPA 和 JPA(理论)
参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...
- spring-boot (三) spring data jpa
学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...
- springboot:spring data jpa介绍
转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...
随机推荐
- liunux 6.5设置网卡默认开启
编辑如下文件; vi /etc/sysconfig/network-scripts/ifcfg-eth0 把 ONBOOT=no 改为 ONBOOT=yes 好了网卡会在启动机器的时候一起启动了.
- Data Calendar
1.Date对象 Date类在java.util包中.使用Date类的无参数构造方法创建的对象可以获取本地当前时间. 用Date的构造方法Date(long time)创建的Date对象表 示相对19 ...
- spring boot集成mybatis框架
概述 中文官网:http://www.mybatis.cn 参考教程:https://www.w3cschool.cn/mybatis MyBatis Plus:http://mp.baomidou. ...
- 银行业评分卡制作——IV、WOE
参考链接:https://blog.csdn.net/kevin7658/article/details/50780391 1.IV的用途 IV的全称是Information Value,中文意思是信 ...
- NGNIX 开启socket分发的使用配置
worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/err ...
- uWSGI和WSGI之间的关系
一.WSGI 协议 WSGI:是一种协议规范,起到规范参数的作用,就像告诉公路一样,规定超车靠右行,速度不低于90km/h,等.但这一切都是对双方进行沟通,比如,重庆到武汉这条高速路,这儿重庆和武汉就 ...
- 用工具堆砌的DevOps 幻觉
作者:顾宇 thoughtworks高级咨询师 在第一届 DevOpsDays结束后,DevOps 运动则如星火燎原之势在全球发展开来.随着 DevOps 思想的不断传播,相对的质疑和批评也从未停止过 ...
- ES 6 新特性笔记
let 与 var 的区别 功能 let var 块级作用域 ️ 变量提升 ️ 重复声明(相同作用域内) ️ var 没有块级作用域的解决方法 使用函数替代块级作用域,以保证变量的正常使用,如: .. ...
- [BUUCTF]REVERSE——[V&N2020 公开赛]CSRe
[V&N2020 公开赛]CSRe 附件 步骤: 例行检查,无壳儿,但是有NET混淆,使用de4dot工具进行处理 之后用dnSpy打开,从入口点开始看程序 找到有关flag的信息 flag由 ...
- python获取命令行传参的两种种常用方法argparse解析getopt 模块解析
方法一:argparse解析 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # @Time: 2020/5/20 10:38 # @Author:zhan ...