本章详细讲解如何利用方法名定义查询方法(Defining Query Methods)
(1)定义查询方法的配置方法
由于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。
(2)方法的查询策略设置
通过@EnableJpaRepositories(queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND)可以配置方法的查询策略,其中QueryLookupStrategy.Key的值一共有三个。
CREATE:直接根据方法名进行创建。规则是根据方法名称的构造进行尝试,一般的方法是从方法名中删除给定的一组已知前缀,并解析该方法的其余部分。如果方法名不符合规则,启动的时候就会报异常。
USE_DECLARED_QUERY:声明方式创建,即本书说的注解方式。启动的时候会尝试找到一个声明的查询,如果没有找到就将抛出一个异常。查询可以由某处注释或其他方法声明。
CREATE_IF_NOT_FOUND:这个是默认的,以上两种方式的结合询,就用create的方法名创建规则创建一个查询。
除非有特殊需求,一般直接用默认的,不用管。配置示例如下
(3)查询方法的创建
为分隔符来指示实际标准的开始。在一个非常基本的水平上,你可以定义实体性条件,并与它们串联(And和Or)。
controller里面进行调用以查看效果:
些常见的事项需要注意:
分内容。
章节,了解特定于场景的查询方法。
序的查询方法来影响查询结果。
(4)关键字列表
注意,除了find的前缀之外,我们查看PartTree的源码,还有如
下几种前缀:
使用的时候要配合不同的返回结果进行使用,例如:
(5)方法的查询策略的属性表达式
在这种情况下,方法名为:
创建及其查找的过程是:解析算法首先将整个割点移动到左边(Address、ZipCode),然后继续。
addressZip可能没有code属性)。
的方法名称最终会是:
循标准Java命名约定(不使用属性名称中的下划线,而是使用骆驼示
例)。命名属性的时候注意一下这个特性。
(6)查询结果的处理
1.参数选择分页和排序(Pageable/Sort)
于查询
示例:在查询方法中使用Pageable、Slice和Sort。
场景也不用关心一共有多少页。
须不被发布的附加计数查询),而仅仅是限制查询仅查找给定范围的实体。
2.限制查询结果
示例:在查询方法上加限制查询结果的关键字first和top。
限制查询分页(以及可用页数的计算),则在限制结果中应用。
2.(List/Stream/Page/Future)
Page和List在上面的示例中都有涉及,下面介绍几种特殊的。
1.流式查询结果
的方法用于执行流。
2.异步查询结果
Spring TaskExecutor的任务中,比较适合定时任务的实际场景。
3 Projections对查询结果的扩展
示成视图对象。
的写法如下:
基于projections的思路,其实是比较容易的。我们只需要声明一个
接口,包含要返回的属性的方法即可,例如:
Repository里面的写法如下,直接用这个对象接收结果即可
会有动态代理机制为这个接口生成一个实现实体类。
(2)查询关联的子对象,例如:
(3)@Value和SPEL也支持:
lastname相加的只有fullName的结果集合。