仓库
本章将介绍 Spring Data 仓库的基本基础以及 Elasticsearch 的具体内容。在继续学习 Elasticsearch 的具体内容之前,请确保你对基本概念有扎实的理解。
Spring Data 仓库抽象的目标是显著减少为各种持久化存储实现数据访问层所需的样板代码量。
章节摘要
核心概念
Spring Data 存储库抽象中的核心接口是 Repository。它以要管理的领域类以及领域类的标识符类型作为类型参数。此接口主要作为标记接口,用于捕获要处理的类型,并帮助您发现扩展此接口的接口。
定义仓库接口
要定义一个仓库接口,首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 Repository 接口,并且指定领域类和 ID 类型。如果你想为该领域类型公开 CRUD 方法,可以扩展 CrudRepository 或其变体,而不是 Repository。
Elasticsearch 仓库
本章包括 Elasticsearch 仓库实现的详细信息。
反应式 Elasticsearch 仓库
响应式 Elasticsearch 仓库支持建立在核心仓库支持的基础上,该支持在 Repositories 中进行了说明,利用通过响应式 REST 客户端执行的响应式 Elasticsearch 操作提供的功能。
创建仓库实例
本节介绍如何为定义的仓库接口创建实例和 bean 定义。
定义查询方法
仓库代理有两种方式可以从方法名称派生出特定于存储的查询:
查询方法
Elasticsearch 模块支持所有基本的查询构建功能,包括字符串查询、原生搜索查询、基于条件的查询,或者从方法名派生查询。
投影
Spring Data 查询方法通常返回由存储库管理的聚合根的一个或多个实例。然而,有时可能需要基于这些类型的某些属性创建投影。Spring Data 允许建模专用的返回类型,以更有选择性地检索受管理聚合的部分视图。
自定义仓库实现
Spring Data 提供了多种选项来创建查询方法,而无需编写大量代码。但当这些选项无法满足你的需求时,你也可以为仓库方法提供自定义的实现。本节将介绍如何实现这一点。
从聚合根发布事件
由仓库管理的实体是聚合根。在领域驱动设计(Domain-Driven Design)应用程序中,这些聚合根通常会发布领域事件。Spring Data 提供了一个名为 @DomainEvents 的注解,你可以将其用于聚合根的方法上,以便尽可能简化事件的发布,如下例所示:
仓库方法的空值处理
自 Spring Data 2.0 起,返回单个聚合实例的仓库 CRUD 方法使用 Java 8 的 Optional 来表示可能缺少值的情况。除此之外,Spring Data 还支持在查询方法中返回以下包装类型:
CDI 集成
Spring Data Elasticsearch 的存储库也可以使用 CDI 功能进行设置。
仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制通常支持的主题关键字,用于表达谓词。请查阅特定存储的文档以获取支持的关键字的准确列表,因为此处列出的一些关键字可能在特定存储中不受支持。
仓库查询返回类型
下表列出了 Spring Data 仓库通常支持的返回类型。但是,请查阅特定存储的文档以获取支持的返回类型的准确列表,因为此处列出的某些类型在特定存储中可能不受支持。