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. 在应用程序中的所有其他bean被销毁之前执行一步工作

    1.实现ServletContextListener.ApplicationContextAware两个接口,在销毁方法里借助ApplicationContextAware注入的application ...

  2. Dubbo管控平台

    2019年初,官方发布了Dubbo管理控制台0.1版本.结构上采取了前后端分离的方式,前端使用Vue和Vuetify分别作为Javascript框架和UI框架,后端采用Spring Boot框架 一. ...

  3. 如何利用EL表达式获取list,map,对象等值

    <%@ page import="com.hopetesting.domain.User" %><%@ page import="java.util.* ...

  4. 【手帐】Bullet Journal教程

    最近觉得自己的日程记录本有待提高,于是从今年开始开始入坑了手帐. *内容源自Bullet Journal官网.https://bulletjournal.com/pages/learn 快速笔记 Bu ...

  5. Linkerd Service Mesh 授权策略(Server & ServerAuthorization)

    简介 Server 和 ServerAuthorization 是 Linkerd 中的两种策略资源, 用于控制对 mesh 应用程序的入站访问. 在 linkerd 安装期间,policyContr ...

  6. 捷码:重塑DevOps,打造更流畅紧密的开发与服务交付业务链

    捷码Gemcoder 1周前如果有机会安排一场行业吐槽大会,熟悉软件开发.交付.服务业务各环节的业内人士,对开发中的各种扯皮.交付反反复复.运维服务中的提心吊胆,往往会有很多深刻的体验和刻骨铭心的案例 ...

  7. Python matplotlib绘图设置图例

    一.语法简介 plt.legend(loc=2,edgecolor='red',facecolor='green',shadow='True',fontsize=10) #edgecolor 图例边框 ...

  8. C语言程序与设计:统计素数并求和

    目录 C语言程序与设计:统计素数并求和 1.题目要求 2.分析 3.代码 C语言程序与设计:统计素数并求和 1.题目要求 输入两个正整数 m 和 n(1≤m≤n≤500),统计给定整数 m 和 n 区 ...

  9. Dubbo配置注册中心设置application的name使用驼峰命名法存在的隐藏项目启动异常问题

    原创/朱季谦 首先,先提一个建议,在SpringBoot+Dubbo项目中,Dubbo配置注册中心设置的application命名name的值,最好使用xxx-xxx-xxx这样格式的,避免随便使用驼 ...

  10. CF656C Without Text 题解

    Content 输入一个字符串 \(s\),遍历每一个字符,如果这个字符是小写字母,那么答案就加上这个字母的字母表序:否则,如果这个字符是小写字母,那么答案就减去这个字母的字母表序.求最后的答案. 字 ...