本节书摘来自异步社区《Spring Data实战》一书中的第2章,第2.2节,作者: 【美】Mark Pollack , Oliver Gierke , Thomas Risberg , Jon Brisbin , Michael Hunger著,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.2 定义查询方法

2.2.1 查找查询的策略
刚才看到的接口只声明了一个简单的查询方法。声明的方法会被基础设施探测到并进行解析,最终衍生出与存储相关的查询。但是,随着查询变得更加复杂,方法名会变得很冗长,显得很笨拙。对于更复杂的查询,依靠方法解析器所支持的关键字就不够了。因此,每种存储模块都提供了@Query注解,如示例2-8所示,它会接受存储相关的查询语言所支持的查询字符串,从而允许查询执行时进一步地定制化。

示例2-8 使用@Query注解手动定义查询

在这里,我们使用JPA作为例子并手动定义了一个查询,当然这个查询原本也是可以通过衍生得到的。

查询甚至可以外部化配置到属性文件中(它位于MATA-INF目录下的$store-named- queries.properties文件中),在这里$store是用于替换jpa、mongo以及neo4j等的占位符。key值必须要遵循$domainType.$methodName这样的约定。因此,为了将我们已有的方法替换成外部配置的命名查询,key将会是Customer.findByEmailAddress。如果是使用已命名查询的话,那就不需要使用@Query注解了。

2.2.2 衍生查询
如示例2-9所示,查询衍生机制内置于Spring Data Repository的基础设施之中,对基于Repository的实体来构建限制性的查询很有用处。我们会从方法中截取findBy、readBy以及getBy前缀并解析剩余的部分。一个基础的用法是,基于实体的属性来定义条件并使用And和Or将它们连接起来。

示例2-9 由方法名衍生查询

解析的实际结果依赖于我们所使用的数据存储。这里也有一些需要注意的通用事项。表达式通常会是属性的遍历以及操作符,它们可以连接起来。如示例2-9所示的那样,可以通过And以及Or来连接属性表达式。除此之外,对于属性表达式来说,还可以支持各种操作符,如Between、LessThan、GreaterThan以及Like。因为不同的数据存储之间所支持的操作符有所区别,所以要看查阅每种存储对应的章节。

属性表达式
属性表达式可以直接引用所管理实体的属性(如示例2-9中所示)。在查询创建的时候,我们已经确保所解析的属性就是领域类的属性。但是,依然可以遍历嵌套的属性来定义限制条件。在前面我们可以看到,Customer的Address中具有ZipCode属性。在这种情况下,如下这种方法名的查询将会创建x.address.zipCode这样的属性遍历。

这个方案的算法首先会将整体(AddressZipCode)作为一个属性进行解析并检查领域类中是否具有该名称的属性(第一个字母小写)。如果它存在的话,就会使用该属性。如果不存在,它会从右边开始将源信息按照“驼峰”命名的规则将其拆分为头部和尾部,然后尝试查找对应的属性(如AddressZip和Code)。如果按照这个头部信息找到了属性,那么我们将会使用尾部的信息继续往下构建树形的信息。因为示例中,第一次的分割并不匹配,我们将分割点继续左移(从“AddressZip、Code”移到“Address、ZipCode”)。

尽管这在大多数的场景下都是可行的,但是在一定情况下算法可能会选择错误的属性。假设Customer同时还有一个addressZip属性。那么我们的算法将会在第一次分割的时候就完成了匹配,这实际上选择了错误的属性,并且会导致最终的失败(因为addressZip类型可能并没有code属性)。为了解决这种模棱两可的问题,可以在方法名中使用下划线(_)来手动定义遍历点。所以,我们的方法名最终看起来是这样的:

2.2.3 分页和排序
如果查询所返回的结果数量增长很明显,那么分块访问数据就很有意义了。为了做到这一点,Spring Data提供了可与Repository一起使用的分页API。要读取哪一块数据的定义隐藏在Pageable接口及其实现PageRequest之中。得到的分页数据存放在Page中,它不仅包含了数据本身,还包含了元信息,这些信息包括它是不是第一页或最后一页以及一共有多少页等。为了计算这个元数据,除了初始的查询外,我们需要触发第二次查询。

借助于Repository,我们要使用分页功能时只需添加一个Pageable方法参数即可。不像其他的参数那样,这个参数是不与查询绑定的,用来限制返回的结果集。一种可选的方案就是返回Page类型,它会对结果集进行限制,但是需要另外一次查询来获取元信息(如可用元素的总数)。另一种可选的方案是使用List,它会避免额外的查询,但是不会提供元数据。如果不需要分页功能,只是想要排序,那么可以给方法签名上添加Sort参数,如示例2-10所示。

示例2-10 使用Pageable和Sort的查询方法

第一个方法允许传递Pageable实例到查询方法中,从而为静态定义的查询动态地增加分页功能。排序的功能可以通过Sort参数显式地传递给方法,也可以内嵌到PageRequest值对象中,如示例2-11所示。

示例2-11 使用Pageable和Sort

《Spring Data实战》——2.2 定义查询方法相关推荐

  1. Spring Data JPA 从入门到精通~定义查询方法的配置方法

    定义查询方法的配置方法 由于 Spring JPA Repository 的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法,从方法名称中可以指定特定用于存储的查询和更新,或通过使用 @Qu ...

  2. Spring Data Jpa的JpaRepository的getOne()方法查询数据实体时报错could not initialize proxy

    问题描述:在使用Spring Data Jpa的JpaRepository的getOne()方法查询数据实体时报以下错误: org.hibernate.LazyInitializationExcept ...

  3. @query 注解的定义_SpringDataJpa(5)---定义查询方法

    定义查询方法的配置方法 由于Spring JPA Repository的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法:从方法名称中可以指定特定用于存储的查询和更新,或通过使用@Query ...

  4. java easyui条件组合查询_EasyUi+Spring Data 实现按条件分页查询

    Spring data 介绍 Spring data 出现目的 为了简化.统一 持久层 各种实现技术 API ,所以 spring data 提供一套标准 API 和 不同持久层整合技术实现 . 自己 ...

  5. 《Spring Data实战》——导读

    ** 前言 ** 数据访问领域在过去的7年间发生了重要的变化.过去30年间一直占据企业级数据存储和处理核心位置的关系型数据库已经不能再独领风骚了.在过去的7年间诞生了很多可选的数据存储形式,当然也有的 ...

  6. gispython定义查询_定义查询方法

    从方法名称中可以制定特定用于存储的查询和更新 通过使用@Query注解手动定义查询 方法的查询策略设置 通过 @EnableJpaRepositories(queryLookupStrategy = ...

  7. Spring Data JPA 多表关联查询的实现

    Spring Data JPA 多表关联查询的实现 多表查询在spring data jpa中有两种实现方式,第一种是利用hibernate的级联查询来实现,第二种是创建一个结果集的接口来接收连表查询 ...

  8. ORM框架之Spring Data JPA(三)高级查询---复杂查询

    一.spring data jpa高级查询 1.1Specifications动态查询 有时我们在查询某个实体的时候,给定的条件是不固定的,这时就需要动态构建相应的查询语句,在Spring Data ...

  9. Spring Data Solr教程:动态查询

    Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它. 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的. 在这种情况下,执行的搜索查询取决于收到的输入. ...

  10. Spring Data JPA_多表关联查询中应该注意的问题

    今天在写Spring Data JPA的时候发现这样一个问题 问题如下: Caused by: org.hibernate.DuplicateMappingException: Table [sys_ ...

最新文章

  1. VS Code识别编辑规范,ESlint规则,VS Code保存去掉自动加分号、逗号、双引号
  2. 回溯法基本思想_LeetCode--回溯法心得
  3. 初识c++中的函数模板
  4. 云原生时代微服务的高可用架构设计
  5. hdu1251(统计难题)
  6. vs没有添加引用_国内考研VS英国读研!各有哪些利弊?
  7. vSphere 5.5:使用 RVC VSAN 监控工具
  8. matlab 三维转二维,求助,二维图像如何绕轴旋转成为三维图像
  9. EJB(RMI学习)
  10. 荣誉背后的故事:达内到底有多强?
  11. 初中计算机课件flash,初中数学flash课件(共100个)
  12. PMI与股市同期走势图
  13. 自动机器学习-auto-sklearn
  14. 这些“新职业”到底好不好干?听听过来人怎么说
  15. eye-in-hand手眼标定系统
  16. 语音识别-人工智能实验室旗下语音识别频道,汇集最新最全的语音识别新闻及资讯,让您掌握语音识别第一手的资讯-中国人工智能网-Powered by www.AiLab.cn
  17. 实用软件测试技术与持续质量改进方法 培训课程
  18. CRC校验原理的完整学习
  19. 贪心算法|406. 根据身高重建队列|先排序后插队
  20. 【web安全】从2022中科大hackgame web中学习pdflatex RCE和python反序列化

热门文章

  1. 数字图像处理原理与实践:基于Visual C++开发
  2. windowsf进程管理器中进程解释
  3. java 焦点转移_将焦点移至键Enter上的下一个控件
  4. 我用一篇文章,让你快速上手Kotlin
  5. Flutter学习 — 给新页面传值
  6. 7-24 求集合数据的均方差 (15 分)
  7. rk3399_android10编译说明
  8. git把当前修改提交合并到上一条提交如何操作
  9. [HDU3507]Print Article
  10. .netcore signalR 实时消息推送