使用 Spring Data 仓库
Spring Data 仓库抽象的目标是大幅减少为各种持久化存储实现数据访问层所需的样板代码量。
本节小结
📄️ 核心概念
Spring Data 仓库抽象中的核心接口是 Repository 。它以需要管理的领域类以及该领域类的标识符类型作为类型参数。该接口主要充当标记接口,用以捕获要处理的类型,并帮助您发现扩展了该接口的接口。
📄️ 查询方法
标准的 CRUD 功能仓库通常会对底层数据存储进行查询。借助 Spring Data ,声明这些查询成为一个四步流程:
📄️ 定义仓库接口
要定义仓库接口,您首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 `Repository` ,并以领域类和 ID 类型作为类型参数。如果您希望为该领域类型暴露 CRUD 方法,可以扩展 `CrudRepository` 或其某个变体,而不是 `Repository` 。
📄️ 定义查询方法
仓库代理有两种方式从方法名派生出特定存储的查询:
📄️ 向量搜索
随着生成式 AI 的兴起,向量数据库在数据库领域获得了强劲的发展势头。这类数据库能够高效地存储和查询高维向量,使其非常适合语义搜索、推荐系统和自然语言理解等任务。
📄️ 创建仓库实例
本节介绍如何为已定义的仓库接口创建实例和 bean 定义。
📄️ 自定义仓库实现
Spring Data 提供了多种选项,让您只需少量编码即可创建查询方法。但当这些选项无法满足您的需求时,您也可以为仓库方法提供自己的自定义实现。本节介绍如何做到这一点。
📄️ 从聚合根发布事件
由仓库管理的实体就是聚合根。在领域驱动设计的应用中,这些聚合根通常会发布领域事件。 Spring Data 提供了一个名为 @DomainEvents 的注解,您可以将其用于聚合根的某个方法,以尽可能简便地完成该发布,如下例所示:
📄️ Spring Data 扩展
本节介绍一组 Spring Data 扩展,它们使 Spring Data 能够在多种场景下使用。目前,大多数集成都面向 Spring MVC 。
📄️ 滚动
滚动是一种对较大结果集逐块进行迭代的更精细方式。滚动由稳定排序、滚动类型(基于偏移量或基于键集的滚动)以及结果限制组成。您可以使用属性名定义简单的排序表达式,并通过查询派生使用 Top 或 First 关键词定义静态结果限制。您可以将表达式拼接起来,把多个条件合并为一个表达式。
📄️ 仓库方法的空值处理
返回单个聚合实例的仓库 CRUD 方法可以使用 Optional 来指示值可能不存在。除此之外, Spring Data 还支持在查询方法上返回以下包装器类型:
📄️ 投影
Spring Data 查询方法通常返回由仓库管理的聚合根的一个或多个实例。不过,有时可能希望基于这些类型的某些属性创建投影。 Spring Data 允许对专用返回类型建模,从而更有选择性地检索被管理聚合的部分视图。