热门标签 | HotTags
当前位置:  开发笔记 > 前端 > 正文

SpringDataJPA带条件分页查询实现原理

这篇文章主要介绍了SpringDataJPA带条件分页查询实现原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

最新Spring Data JPA官方参考手册 Version 2.0.0.RC2,2017-07-25

https://docs.spring.io/spring-data/jpa/docs/2.0.0.RC2/reference/html/

JPA参考手册 (找了半天, 在线版的只找到这个)

https://www.objectdb.com/java/jpa

Spring Data JPA的Specification类, 是按照Eric Evans的《领域驱动设计》书中Specification的概念和语义来定义查询条件的API。
使用Spring Data JPA, 我们一般将自己的dao接口继承CrudRepository接口和JpaSpecificationExecutor接口, 由框架生成代理类来完成具体的调用, 而不用自己写daoImpl实现类, 因为这两个接口自带了很多方法, 如果我们写实现类会发现一上来就需要实现十来个方法, 比较麻烦。

其中CrudRepository接口主要负责增/删/改的操作, JpaSpecificationExecutor接口主要负责查询的操作, 另外, 框架还支持在dao接口的方法名上定义一些简单的语义来进行增删改查, 底层会对应地做具体实现。

那如何封装具体的查询条件呢?

在service层调用dao接口从JpaSpecificationExecutor继承的抽象查询方法, 它就会自动让你准备相关实参, 其中Specification对象就是经常用在条件查询的方法的一个形参, 也就是说, 封装查询条件的过程转移到service层了。

我们一般以匿名内部类的方式new一个Specification对象, 实现其中的toPredicate方法, 举个例子,

Specification specification = new Specification() {
      @Override
      public Predicate toPredicate(Root root, CriteriaQuery<&#63;> criteriaQuery, CriteriaBuilder criteriaBuilder) {
      ...
};

其中, Predicate, Root, CriteriaQuery, CriteriaBuilder都是javax.persistence包中的接口, 方法的这3个实参由框架交给我们。

Predicate意思是"描述语", 就是我们封装完查询条件后要交给Specification一个清楚的描述, 要怎么组合sql语句去查询。

Root表示为泛型里的Person对象描述一个根位置, 可以从这个根位置去取该对象的属性, 以及属性的属性, 类似对象导航的意思, 比如要取Person地址属性的城市, 就可以root.get("address").get("city").as(String.class), 其返回值是一个Expression对象;

CriteriaQuery代表条件查询,主要提供where、group by、having、order by等。

CriteriaBuilder用于构造筛选条件,主要提供equal、and、or、lt、gt、between、like等, 以及获得CriteriaQuery、CriteriaUpdate、CriteriaDelete对象。构造每个筛选条件一般需要Expression类型作为实参, 可以通过Root对象调用get()方法得到。如果有多个筛选条件, 调用criteriaBuilder的and、or等方法连接起来, 一般是链式调用的形式。

举个简单的实际例子:

//带条件的分页查询, 根据person的first_name和last_name进行模糊查询
//为了直观, 假设两个字段都存在且不为空串, 省掉非空判断和对应的处理
public Page findSearch(Person person, int page, int size) {
  Specification specification = new Specification() {
   @Override
   public Predicate toPredicate(Root root, CriteriaQuery<&#63;> criteriaQuery, CriteriaBuilder criteriaBuilder) {
      Predicate predicate1 = criteriaBuilder.like(root.get("first_name").as(String.class), "%"+person.getFirstName()+"%");
      Predicate predicate2 = criteriaBuilder.like(root.get("last_name").as(String.class), "%"+person.getLastName()+"%");
        Predicate finalPredicate = criteriaBuilder.and(predicate1, predicate2);
       return finalPredicate;
   }
  };
  PageRequest pageRequest = PageRequest.of(page-1, size);
  return personDao.findAll(specification, pageRequest);
}

当然这都是JPQL的语法了, 很多开发者也经常在dao接口中直接写SQL语句来让框架查询, 使用起来感觉有点类似MyBatis, 会显得清爽很多, 只需定义一个抽象方法加上对应的注解@Modifying和@Query(value="sql语句", nativeQuery=true)即可, 它还有一个好处, 不用让封装查询条件这种事情跑到service层去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 本文提供了在Windows系统上部署和启动MySQL免安装版本的详细步骤。首先,从MySQL官方网站下载社区版免安装包(https://dev.mysql.com/downloads/mysql/8.0.html),将其解压至指定目录,例如D:\tools\mysql。接着,配置系统环境变量,确保MySQL命令行工具可以在任意路径下使用。此外,还需创建并配置my.ini文件以设置MySQL的基本参数,确保数据库服务能够顺利启动和运行。 ... [详细]
  • 本周,我深入研究了 ECharts 插件的使用方法,整体感觉插件操作较为简便,但后台算法较为复杂。此外,我还学习了 MySQL 函数的新应用,进一步提升了数据库操作的灵活性。同时,分享了自己在 Python 书籍外借过程中的体验,总结了一些实用的借阅技巧和心得。 ... [详细]
  • 使用Charles代理工具破解HTTPS请求的详细方法与技巧
    当你将应用程序的网络请求从HTTP升级到HTTPS后,可能会遇到无法捕获请求的问题。不用担心,这只是因为应用程序进行了加密升级。本文将详细介绍如何使用Charles代理工具破解HTTPS请求,包括具体的配置步骤和实用技巧,帮助你轻松解决这一问题。 ... [详细]
  • Python编程入门:3.11.1 版本中的Collatz序列解析与实践
    在Python 3.11.1版本中,通过编写一个名为`collatz()`的函数来解析和实践Collatz序列。该函数接受一个名为`number`的参数:如果`number`是偶数,则函数将输出`number // 2`并返回该值;如果`number`是奇数,则输出和返回`3 * number + 1`。这一过程有助于理解递归函数和条件逻辑在Python中的应用。 ... [详细]
  • 本文详细解析了CSS背景属性的简写顺序,包括背景颜色、背景图像、背景重复方式、背景固定方式等关键要素,帮助开发者更好地理解和应用这一重要样式规则。通过具体示例和实际应用场景,文章深入探讨了每个属性在简写形式中的排列和作用,为前端开发提供了实用的参考。 ... [详细]
  • 指针超出边界:深入解析与防范措施
    在编程过程中,使用 `pNULL` 来判断遍历是否完成是一种不推荐的做法。本文深入分析了指针超出边界的问题,并提出了有效的防范措施,以确保代码的健壮性和安全性。通过详细探讨指针操作中的常见错误及其潜在风险,本文为开发者提供了实用的指导建议,帮助他们在实际开发中避免此类问题。 ... [详细]
  • 【Beta版】第四次Scrum会议纪要与进展更新
    本次Scrum会议由项目经理主持,于5月9日晚10点30分召开,持续15分钟。会议主要讨论了团队成员在过去一天的工作进展及下一步计划。具体而言,木鬼负责撰写博客并整理相关文档,而swoip则专注于改进用户界面的设计与功能。此外,团队还对当前的任务列表进行了更新,确保各项任务按时推进。 ... [详细]
  • 构建用户可查询的员工信息管理系统(上篇)
    构建用户可查询的员工信息管理系统(上篇)旨在设计一个安全且易于使用的员工信息查询平台。该系统要求实现以下功能:1. 用户必须通过身份验证才能访问系统;2. 员工信息表应包含关键字段,如ID、姓名、部门和电话号码;3. 身份验证成功后,用户能够准确查询到所需信息。此外,系统还应具备数据加密和权限管理等高级功能,以确保信息安全和合规性。 ... [详细]
  • 利用Apache构建高效稳定的Web服务器环境
    本文详细介绍了如何利用Apache构建高效稳定的Web服务器环境。首先,概述了Apache服务器的基本概念及其安装步骤,并深入探讨了相关配置文件的设置方法。接着,通过具体的实验环境示例,展示了服务端(域名:zhangpp63.cn,IP地址:192.168.1.63)和客户端的配置过程,确保读者能够全面理解并实际应用这些技术。此外,还提供了一些优化建议,以提高服务器的性能和稳定性。 ... [详细]
  • Microsoft Access 是一款集成了数据库管理系统(DBMS)功能和应用程序开发工具的综合性软件。它不仅能够高效地管理和操作数据库,还提供了丰富的数据处理和应用开发功能,使用户能够轻松创建复杂的数据管理解决方案。通过利用其强大的查询、报表和表单设计工具,用户可以实现数据的高效组织、分析和呈现,从而提升工作效率。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • SQL Server开发技巧:修改表结构后的视图批量更新方法与实践 ... [详细]
  • 如何在Oracle ASM_Diskgroup中重命名现有磁盘
    如何在Oracle ASM_Diskgroup中重命名现有磁盘 ... [详细]
  • 在探讨如何高效处理大规模数据报表的分页展示之前,首先需要明确导致报表加载缓慢的主要原因。通常情况下,这主要是由于两个方面:一是查询条件过于宽泛,使得数据库返回的结果集包含数百万甚至更多的记录;二是前端渲染性能不足,无法高效处理大量数据。为了优化这一过程,可以从以下几个方面入手:优化查询条件,减少不必要的数据返回;采用分页查询技术,每次仅加载所需的数据;利用缓存机制,减少对数据库的频繁访问;提升前端渲染效率,使用虚拟滚动等技术提高用户体验。 ... [详细]
  • 在CentOS上部署和配置FreeSWITCH
    在CentOS系统上部署和配置FreeSWITCH的过程涉及多个步骤。本文详细介绍了从源代码安装FreeSWITCH的方法,包括必要的依赖项安装、编译和配置过程。此外,还提供了常见的配置选项和故障排除技巧,帮助用户顺利完成部署并确保系统的稳定运行。 ... [详细]
author-avatar
Peaches小窝
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有