定义查询方法的配置方法

由于Spring JPA Repository的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法:从方法名称中可以指定特定用于存储的查询和更新,或通过使用@Query手动定义的查询,这个取决于实际存储操作。只需要实体Repository继承Spring Data Common里面的Repository接口即可,就像前面我们讲的一样。如果你想有其他 更多默认通用方法的实现,可以选择JpaRepository、PagingAndSortingRepository、CrudRepository等接口,也可以直接继承JpaSpecificationExecutor、QueryByExampleExecutor和自定义Response,都可以达到同样的效果。

如果你不想扩展Spring数据接口,还可以使用它来注解存储库接口@RepositoryDefinition。扩展CrudRepository公开了一套完整的方法来操纵实体。如果你希望对所暴露的方法有选择性,只需要将暴露的方法复制CrudRepository到域库中即可。其实也是自定义Repository的一种。

下面的示例,选择性地暴露CRUD方法:

在这个示例的第一步中为所有域存储库定义了一个公共基础接口,并将其暴露出来。findOne()和save()方法将被路由到由Spring Data提供的、你选择的存储库的基本存储库实现中,例如JPA 中的SimpleJpaRepository。因为它们正在匹配方法签名CrudRepository,所以UserRepository将能够保存用户,并通过id查找单个用户信息,以及触发查询以通过其电子邮件地址查找Users。

方法的查询策略设置

通过@EnableJpaRepositories(queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)可以配置方法的查询策略,其中QueryLookupStrategy.Key的值一共有三个。

CREATE:直接根据方法名进行创建。规则是根据方法名称的构造进行尝试,一般的方法是从方法名中删除给定的一组已知前缀,并解析该方法的其余部分。如果方法名不符合规则,启动的时候就会报异常。

USE_DECLARED_QUERY:声明方式创建,即本书说的注解方式。启动的时候会尝试找到一个声明的查询,如果没有找到就将抛出一个异常。查询可以由某处注释或其他方法声明。

CREATE_IF_NOT_FOUND:这个是默认的,以上两种方式的结合版。先用声明方式进行查找,如果没有找到与方法相匹配的查询,就用create的方法名创建规则创建一个查询。

除非有特殊需求,一般直接用默认的,不用管。

查询方法的创建

内部基础架构中有个根据方法名的查询生成器机制,对于在存储库的实体上构建约束查询很有用。该机制方法的前缀有find…By、read…By、query…By、count…By和get…By,从这些方法可以分析它的其余部分(实体里面的字段)。引入子句可以包含其他表达式,例如在Distinct要创建的查询上设置不同的标志。然而,第一个By作为分隔符来指示实际标准的开始。在一个非常基本的水平上,你可以47定义实体性条件,并与它们串联(And和Or)。用一句话概括,待查询功能的方法名由查询策略(关键字)、查询字段和一些限制性条件组成。在如下例子中,可以直接在controller里面进行调用以查看效果:

解析方法的实际结果取决于创建查询的持久性存储。但是,有一 些常见的事项需要注意:

表达式通常是可以连接的运算符的属性遍历。你可以使用组合属性表达式AND和OR。你还可以将运算关键字Between、LessThan、GreaterThan、Like作为属性表达式。受支持的操作员可能因数据存储而异,因此请参阅官方参考文档的相应部分内容。

该方法解析器支持设置一个IgnoreCase标志个别特性(例如,findByLastnameIgnoreCase(…))或支持忽略大小写(通常是一个类型的所有属性为String的情况下,例如,findByLastnameAndFirstnameAllIgnoreCase(…))。是否支持忽略示例可能会因存储而异,因此请参阅参考文档中的相关章节,了解特定于场景的查询方法。

可以通过OrderBy在引用属性和提供排序方向(Asc或Desc)的查询方法中附加一个子句来应用静态排序。要创建支持动态排序的查询方法来影响查询结果。

关键字列表

注意,除了find的前缀之外,查看PartTree的源码,还有如

下几种前缀:

方法的查询策略的属性表达式

属性表达式(Property Expressions)只能引用托管(泛化)实体的直接属性,如前一个示例所示。在查询创建时,你已经确保解析的属性是托管实体的属性。同时,还可以通过遍历嵌套属性定义约束。假设一个Person实体对象里面有一个Address属性里面包含一个ZipCode属性。

在这种情况下,方法名为:

创建及其查找的过程是:解析算法首先将整个part(AddressZipCode)解释为属性,并使用该名称 (uncapitalized)检查域类的属性。如果算法成功,就使用该属性。如果不是,就拆分右侧驼峰部分的信号源到头部和尾部,并试图找出相应的属性,在我们的例子中是AddressZip和Code。如果算法找到一个具有头部的属性,那么它需要尾部,并从那里继续构建树,然后按照刚刚描述的方式将尾部分割。如果第一个分割不匹配,就将分割点移动到左边(Address、ZipCode),然后继续。虽然这在大多数情况下应该起作用,但是算法可能会选择错误的属性。假设Person类也有一个addressZip属性,该算法将在第一个分割轮中匹配,并且基本上会选择错误的属性,最后失败(因为该类型addressZip可能没有code属性)。要解决这个歧义,可以在方法名称中手动定义遍历点,所以我们的方法名称最终会是:

当然Spring JPA里面是将下划线视为保留字符,但是强烈建议遵循标准Java命名约定(不使用属性名称中的下划线,而是使用骆驼示例)。命名属性的时候注意一下这个特性。

@query 注解的定义_SpringDataJpa(5)---定义查询方法相关推荐

  1. springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象

    1.代码: @Query(value = "SELECT * FROM s_order_baseinfo WHERE 1=1 " +"AND IF(''!=:#{#ord ...

  2. JpaRepository查询方法名规范

    JpaRepository的查询 直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:JpaRepository会对方法名进行校验 不符合规范会报错 除非添加@Que ...

  3. Spring Data Solr教程:查询方法

    我们已经了解了如何配置Spring Data Solr. 我们还学习了如何向Solr索引添加新文档,如何更新现有文档的信息以及从Solr索引删除文档. 现在是时候继续前进,学习如何使用Spring D ...

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

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

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

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

  6. SpringBoot使用SpringDataJPA通过@Query注解多对多分页查询

    文章目录 SpringBoot使用JPA@Query注解查询 1. 环境配置 2. 数据库表配置 3. 实体类配置 4. Dao代码 5. Service 代码 6. Controller 代码 7. ...

  7. 第十七章 Caché 定义和使用类查询

    文章目录 第十七章 Caché 定义和使用类查询 类查询简介 使用类查询 定义基本类查询 示例 关于ROWSPEC 关于CONTAINID 查询类的其他参数 定义自定义类查询 定义querynameE ...

  8. Go 学习笔记(27)— type 关键字(类型定义、类型别名、类型查询、定义接口、定义结构体)

    1. 类型别名定义 定义类型别名的写法为: type TypeAlias = Type 类型别名规定: TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类 ...

  9. 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )

    文章目录 一.定义 Join Point 连接点注解 二.定义 Aspect 切面 1.定义 Aspect 切面 2.定义 Aspect 切面 3.逐个处理切入点的各个连接点 4.完整 Aspect ...

最新文章

  1. 科大星云诗社动态20210814
  2. C语言多个变量运算存储过程,postgresql函数中的赋值运算和postgresql函数存储过程实现数据批量插入...
  3. 软件工程软件产品质量要求与评价_软件工程定义
  4. 被坑了 | 那个写公众号,开网店的小小,被花式坑了!
  5. 【2019.09.15】2019icpc上海网络赛
  6. MAC 升级 node.js 的快捷方法
  7. OpenCV算法精解2--OpenCV中C++基本操作2
  8. CLM5.0模式移植篇——驴某人的自我救赎
  9. linux重启tomcat进程,Linux系统重启tomcat服务的方法详解
  10. ios7禁止屏幕旋转,强制竖屏
  11. DotNetCore CAP
  12. 手把手教你 合并分支到master上
  13. with dlz mysql 条件_BIND+DLZ+MYSQL
  14. 寒武纪如何查看mlu的运行状态
  15. 回忆过去回忆一下,也是一种幸福,一种美好
  16. [Validation set: 'activiti-executable-process' | Problem: 'activiti-exclusive-gateway-condition-not-
  17. MATLAB R2018a for Mac
  18. shell一键自动化批量安装服务
  19. 用佛系的心老王软件Android,老王佛系2.2.19蓝奏云苹果最新版
  20. halcon脚本-条形码识别【附源码】

热门文章

  1. SQL优化:使用explain
  2. 为什么有如此多的python版本
  3. hadoop源代码组织结构与阅读技巧
  4. Linux常用命令集合
  5. 10月第1周中国.COM域名增1万个 涨幅环比缩小82%
  6. 配置CACTI监控MySQL数据库状态(1)准备工作
  7. BCH代币化方案讨论大爆发,你的观点是什么?
  8. 三、Flask_会话控制与请求钩子
  9. Java入门之包装类
  10. 访谈|在网络世界捕获威胁的猎人