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 实现分页和条件查询的更多相关文章

  1. JPA && Spring Data && Spring Data JPA

    1.JPA  Java Persistence API,用于对象持久化的一组API,JPA本身是一组规范,让开发者用同一种方式访问不同的ORM框架.其实也就是java实体对象和关系型数据库建立起映射关 ...

  2. 干货|一文读懂 Spring Data Jpa!

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa!其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring D ...

  3. spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  4. 【spring boot 系列】spring data jpa 全面解析(实践 + 源码分析)

    前言 本文将从示例.原理.应用3个方面介绍spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 JPA是什么? JPA (Java ...

  5. Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

    有很多读者留言希望松哥能好好聊聊 Spring Data Jpa! 其实这个话题松哥以前零零散散的介绍过,在我的书里也有介绍过,但是在公众号中还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring ...

  6. Spring Data Jpa 入门学习

    本文主要讲解 springData Jpa 入门相关知识, 了解JPA规范与Jpa的实现,搭建springboot+dpringdata jpa环境实现基础增删改操作,适合新手学习,老鸟绕道~ 1. ...

  7. 来说说JPA、Hibernate、Spring Data JPA之间的什么关系?

    目录 JPA Hibernate Spring Data JPA 实践 来说说JPA.Hibernate.Spring Data JPA之间的什么关系 Java 持久层框架访问数据库的方式大致分为两种 ...

  8. SpringBoot入门:Spring Data JPA 和 JPA(理论)

    参考链接: Spring Data JPA - Reference Documentation Spring Data JPA--参考文档 中文版 纯洁的微笑:http://www.ityouknow ...

  9. spring-boot (三) spring data jpa

    学习文章来自:http://www.ityouknow.com/spring-boot.html spring data jpa介绍 首先了解JPA是什么? JPA(Java Persistence ...

  10. springboot:spring data jpa介绍

    转载自:https://www.cnblogs.com/ityouknow/p/5891443.html 在上篇文章springboot(二):web综合开发中简单介绍了一下spring data j ...

随机推荐

  1. rust常用技巧

    允许未使用的方法,写在文件开头,可过滤过掉该项提示 #![allow(unused)]

  2. 阿里云esc 安装 docker

    1. 更新 yum 到最新: yum update (用 root 用户登录,无需加 sudo,如果不是,需要加,即  yum update ) 2. 安装软件包:yum-util(提供 yum-co ...

  3. Mybatis读取数据实战

    1.Mybatis基础配置 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configu ...

  4. 【C/C++】函数的分文件编写

    创建同名的头文件(.h)和cpp文件. 在头文件里写函数声明,在cpp文件中写函数定义. 在cpp文件中写#include "xx.h" //自定义头文件名 框架(include ...

  5. Snort 入侵检测系统

    Snort 入侵检测系统 一.实验目的 1.掌握snort IDS工作原理 2.应用snort 三种方式工作 二.实验环境 系统环境:Windows环境, kali环境 三.实验原理 1.snort ...

  6. Windows下mysql5.6升级到5.7的方法(亲测有效哦!)

    Mysql的升级方式分为两种:原地升级和逻辑升级.这两种升级方式,本质没有什么区别的. 只是在对数据文件的处理上有些区别而已.原地升级是直接将数据文件进行拷贝,而逻辑升级对数据文件的处理方式是通过逻辑 ...

  7. C#.NET编程小考30题错题纠错

    1)以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储介质中的过程 b) 二进制格式化器的Serialize()和Deserialize()方法可以分别用来实现 ...

  8. Linux下安装chrome

    目录 一.Centos系列 二.Ubuntu系列 一.Centos系列 1.配置yum下载源 vim /etc/yum.repos.d/chrome.repo [google-chrome] name ...

  9. selenium chrome一些配置问题

    chrome和chromedriver要对应,chrome版本查询:打开chrome,在地址栏输入:chrome://version/ 附: 所有chromedriver均可在下面链接中下载到:htt ...

  10. python selenium表单定位

    在Web应用中经常会遇到frame/iframe 表单嵌套页面的应用,WebDriver 只能在一个页面上对元素识别与定位,对于frame/iframe 表单内嵌页面上的元素无法直接定位.这时就需要通 ...