仓库
本章介绍 Spring Data 仓库的基础以及 Cassandra 的特定内容。在继续了解 Cassandra 的特定内容之前,请确保您已充分理解使用 Spring Data 仓库中介绍的基本概念。
Spring Data 仓库抽象的目标是大幅减少为各种持久化存储实现数据访问层所需的样板代码量。
本节小结
核心概念
Spring Data 仓库抽象中的核心接口是 Repository 。它以需要管理的领域类以及该领域类的标识符类型作为类型参数。该接口主要充当标记接口,用以捕获要处理的类型,并帮助您发现扩展了该接口的接口。
定义仓库接口
要定义仓库接口,您首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 `Repository` ,并以领域类和 ID 类型作为类型参数。如果您希望为该领域类型暴露 CRUD 方法,可以扩展 `CrudRepository` 或其某个变体,而不是 `Repository` 。
Cassandra 仓库
要访问存储在 Apache Cassandra 中的领域实体,您可以使用 Spring Data 完善的仓库支持,它能大幅简化 DAO 的实现。为此,请为您的仓库创建一个接口,如下例所示:
创建仓库实例
本节介绍如何为已定义的仓库接口创建实例和 bean 定义。
定义查询方法
仓库代理有两种方式可从方法名派生特定于存储的查询:
Cassandra 专属查询方法
您通常在仓库上触发的大多数数据访问操作,最终都会在 Apache Cassandra 数据库上执行一条查询。定义这样的查询只需在仓库接口上声明一个方法即可。以下示例展示了若干此类方法声明:
向量搜索
随着生成式 AI 的兴起,向量数据库在数据库领域获得了强劲的发展势头。这类数据库能够高效地存储和查询高维向量,使其非常适合语义搜索、推荐系统和自然语言理解等任务。
投影
Spring Data 查询方法通常返回由仓库管理的聚合根的一个或多个实例。不过,有时可能希望基于这些类型的某些属性创建投影。 Spring Data 允许对专用返回类型建模,从而更有选择性地检索被管理聚合的部分视图。
自定义仓库实现
Spring Data 提供了多种选项,让您只需少量编码即可创建查询方法。但当这些选项无法满足您的需求时,您也可以为仓库方法提供自己的自定义实现。本节介绍如何做到这一点。
从聚合根发布事件
由仓库管理的实体就是聚合根。在领域驱动设计的应用中,这些聚合根通常会发布领域事件。 Spring Data 提供了一个名为 @DomainEvents 的注解,您可以将其用于聚合根的某个方法,以尽可能简便地完成该发布,如下例所示:
仓库方法的空值处理
返回单个聚合实例的仓库 CRUD 方法可以使用 `Optional` 来指示值可能不存在。除此之外, Spring Data 还支持在查询方法上返回以下包装器类型:
CDI 集成
仓库接口的实例通常由容器创建,而在使用 Spring Data 时, Spring 容器是最自然的选择。 Spring Data for Apache Cassandra 自带一个定制的 CDI 扩展,让您能够在 CDI 环境中使用仓库抽象。该扩展包含在 JAR 包中。要启用它,只需将 Spring Data for Apache Cassandra JAR 包放入您的 classpath 。接下来,您可以通过为 CassandraTemplate 实现一个 CDI 生产者来搭建基础设施,如下例所示:
仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制普遍支持的、用于表达谓词的主题关键词。有关受支持关键词的确切列表,请参阅特定存储的文档,因为此处列出的某些关键词可能在特定存储中不受支持。
仓库查询返回类型
下表列出了 Spring Data 仓库普遍支持的返回类型。但是,有关受支持返回类型的确切列表,请参阅特定存储的文档,因为此处列出的某些类型可能在特定存储中不受支持。
提前优化
本章介绍 Spring Data 的提前( AOT )优化,这些优化建立在 Spring 的提前优化之上。