@query 注解的定义_SpringDataJpa(5)---定义查询方法
定义查询方法的配置方法
由于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)---定义查询方法相关推荐
- springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象
1.代码: @Query(value = "SELECT * FROM s_order_baseinfo WHERE 1=1 " +"AND IF(''!=:#{#ord ...
- JpaRepository查询方法名规范
JpaRepository的查询 直接在接口中定义查询方法,如果是符合规范的,可以不用写实现,目前支持的关键字写法如下:JpaRepository会对方法名进行校验 不符合规范会报错 除非添加@Que ...
- Spring Data Solr教程:查询方法
我们已经了解了如何配置Spring Data Solr. 我们还学习了如何向Solr索引添加新文档,如何更新现有文档的信息以及从Solr索引删除文档. 现在是时候继续前进,学习如何使用Spring D ...
- Spring Data JPA 从入门到精通~定义查询方法的配置方法
定义查询方法的配置方法 由于 Spring JPA Repository 的实现原理是采用动态代理的机制,所以我们介绍两种定义查询方法,从方法名称中可以指定特定用于存储的查询和更新,或通过使用 @Qu ...
- gispython定义查询_定义查询方法
从方法名称中可以制定特定用于存储的查询和更新 通过使用@Query注解手动定义查询 方法的查询策略设置 通过 @EnableJpaRepositories(queryLookupStrategy = ...
- SpringBoot使用SpringDataJPA通过@Query注解多对多分页查询
文章目录 SpringBoot使用JPA@Query注解查询 1. 环境配置 2. 数据库表配置 3. 实体类配置 4. Dao代码 5. Service 代码 6. Controller 代码 7. ...
- 第十七章 Caché 定义和使用类查询
文章目录 第十七章 Caché 定义和使用类查询 类查询简介 使用类查询 定义基本类查询 示例 关于ROWSPEC 关于CONTAINID 查询类的其他参数 定义自定义类查询 定义querynameE ...
- Go 学习笔记(27)— type 关键字(类型定义、类型别名、类型查询、定义接口、定义结构体)
1. 类型别名定义 定义类型别名的写法为: type TypeAlias = Type 类型别名规定: TypeAlias 只是 Type 的别名,本质上 TypeAlias 与 Type 是同一个类 ...
- 【AOP 面向切面编程】Android Studio 使用 AspectJ 监控方法运行 ( 定义连接点注解 | 定义 Aspect 切面 | 定义切入点 | 逐个处理切入点的各个连接点 )
文章目录 一.定义 Join Point 连接点注解 二.定义 Aspect 切面 1.定义 Aspect 切面 2.定义 Aspect 切面 3.逐个处理切入点的各个连接点 4.完整 Aspect ...
最新文章
- 科大星云诗社动态20210814
- C语言多个变量运算存储过程,postgresql函数中的赋值运算和postgresql函数存储过程实现数据批量插入...
- 软件工程软件产品质量要求与评价_软件工程定义
- 被坑了 | 那个写公众号,开网店的小小,被花式坑了!
- 【2019.09.15】2019icpc上海网络赛
- MAC 升级 node.js 的快捷方法
- OpenCV算法精解2--OpenCV中C++基本操作2
- CLM5.0模式移植篇——驴某人的自我救赎
- linux重启tomcat进程,Linux系统重启tomcat服务的方法详解
- ios7禁止屏幕旋转,强制竖屏
- DotNetCore CAP
- 手把手教你 合并分支到master上
- with dlz mysql 条件_BIND+DLZ+MYSQL
- 寒武纪如何查看mlu的运行状态
- 回忆过去回忆一下,也是一种幸福,一种美好
- [Validation set: 'activiti-executable-process' | Problem: 'activiti-exclusive-gateway-condition-not-
- MATLAB R2018a for Mac
- shell一键自动化批量安装服务
- 用佛系的心老王软件Android,老王佛系2.2.19蓝奏云苹果最新版
- halcon脚本-条形码识别【附源码】