仓库
本章介绍 Spring Data 仓库的基础概念以及 Neo4j 的特有内容。在继续了解 Neo4j 的特有内容之前,请确保您已充分理解这些基础概念。
Spring Data 仓库抽象的目标是大幅减少为各种持久化存储实现数据访问层所需的样板代码量。
本节小结
核心概念
Spring Data 仓库抽象中的核心接口是 Repository 。它以需要管理的领域类以及该领域类的标识符类型作为类型参数。该接口主要充当标记接口,用以捕获要处理的类型,并帮助您发现扩展了该接口的接口。
查询方法
标准的 CRUD 功能仓库通常会对底层数据存储进行查询。借助 Spring Data ,声明这些查询成为一个四步流程:
定义仓库接口
要定义仓库接口,您首先需要定义一个特定于领域类的仓库接口。该接口必须扩展 `Repository` ,并以领域类和 ID 类型作为类型参数。如果您希望为该领域类型暴露 CRUD 方法,可以扩展 `CrudRepository` 或其某个变体,而不是 `Repository` 。
定义查询方法
仓库代理有两种方式从方法名派生出特定存储的查询:
创建仓库实例
本节介绍如何为已定义的仓库接口创建实例和 bean 定义。
自定义仓库实现
Spring Data 提供了多种选项,让您只需少量编码即可创建查询方法。但当这些选项无法满足您的需求时,您也可以为仓库方法提供自己的自定义实现。本节介绍如何做到这一点。
从聚合根发布事件
由仓库管理的实体就是聚合根。在领域驱动设计的应用中,这些聚合根通常会发布领域事件。 Spring Data 提供了一个名为 @DomainEvents 的注解,您可以将其用于聚合根的某个方法,以尽可能简便地完成该发布,如下例所示:
Spring Data 扩展
本节介绍一组 Spring Data 扩展,它们使 Spring Data 能够在多种场景下使用。目前,大多数集成都面向 Spring MVC 。
按示例查询
本章介绍按示例查询( Query by Example )并说明如何使用它。
滚动
滚动是一种对较大结果集逐块进行迭代的更精细方式。滚动由稳定排序、滚动类型(基于偏移量或基于键集的滚动)以及结果限制组成。您可以使用属性名定义简单的排序表达式,并通过查询派生使用 Top 或 First 关键词定义静态结果限制。您可以将表达式拼接起来,把多个条件合并为一个表达式。
Spring Data Neo4j 扩展
Spring Data Neo4j 提供了若干可添加到仓库上的扩展(或称「混入」)。什么是混入?根据 Wikipedia 的定义,混入是一种语言概念,允许程序员将某些代码注入到一个类中。混入编程是一种软件开发风格:功能单元在一个类中被创建,然后与其他类混合在一起。
仓库查询关键词
下表列出了 Spring Data 仓库查询派生机制普遍支持的、用于表达谓词的主题关键词。有关受支持关键词的确切列表,请参阅特定存储的文档,因为此处列出的某些关键词可能在特定存储中不受支持。
仓库查询返回类型
下表列出了 Spring Data 仓库普遍支持的返回类型。但是,有关受支持返回类型的确切列表,请参阅特定存储的文档,因为此处列出的某些类型可能在特定存储中不受支持。
Neo4j 向量搜索
Spring Data Neo4j 通过使用 @VectorSearch 注解,在仓库级别支持 Neo4j 的向量搜索。要使其正常工作, Neo4j 中需要已建立向量索引。如何创建向量索引请参阅 Neo4j 文档。