Spring Data Neo4j Extensions

Available extensions for Spring Data Neo4j repositories

Spring Data Neo4j 提供了一些可以添加到存储库的扩展或“混合”。什么是混合?根据 Wikipedia,混合是一种语言概念,允许程序员将一些代码注入到一个类中。混合编程是一种软件开发风格,其中在类中创建功能单元,然后将其与其他类进行混合。

Java 在语言级别不支持该概念,但我们通过一些接口和运行时模拟它,该运行时添加了适当的实现和拦截器。

默认添加的混合分别为 QueryByExampleExecutorReactiveQueryByExampleExecutor。这些接口在 Query by Example 中进行了详细解释。

提供的其他混合有:

  • QuerydslPredicateExecutor

  • CypherdslConditionExecutor

  • CypherdslStatementExecutor

  • ReactiveQuerydslPredicateExecutor

  • ReactiveCypherdslConditionExecutor

  • ReactiveCypherdslStatementExecutor

Add dynamic conditions to generated queries

QuerydslPredicateExecutorCypherdslConditionExecutor 都提供了相同概念:SDN 生成一个查询,您提供将被添加的“谓词”(Query DSL)或“条件”(Cypher DSL)。我们推荐 Cypher DSL,因为这是 SDN 本机使用的方法。您甚至可能需要考虑使用 annotation processor,它为您生成一个静态元模型。

这是如何工作的?按如上所述声明您的存储库,并添加 一个 以下接口:

link:example$integration/imperative/QuerydslNeo4jPredicateExecutorIT.java[role=include]
1 Standard repository declaration
2 The Query DSL mixin

link:example$integration/imperative/CypherdslConditionExecutorIT.java[role=include]
1 Standard repository declaration
2 The Cypher DSL mixin

使用 Cypher DSL 条件执行器展示示例用法:

link:example$integration/imperative/CypherdslConditionExecutorIT.java[role=include]
1 定义一个命名的 Node 对象,以查询根为目标
2 从此派生一些属性
3 创建一个 or 条件。匿名参数用于名字,命名参数用于姓氏。这是如何在这些片段中定义参数以及优于无法执行此操作的 Query-DSL 混入项的优点之一。使用 Cypher.literalOf 可以表示文字值。
4 从其中一个属性定义一个 SortItem

代码与 Query-DSL 混合非常相似。使用 Query-DSL 混合的原因可以是对 API 比较熟悉,而且它也可以与其他存储一起使用。不采用它的原因是类路径上需要一个额外的库,它缺少遍历关系的支持,以及前面提到的它不支持谓词中的参数(从技术上来说它确实支持,但是没有 API 方法可以实际将它们传递到要执行的查询中)。

Using (dynamic) Cypher-DSL statements for entities and projections

添加相应的混合与使用 sdn-mixins.dynamic-conditions 没有什么不同:

link:example$integration/imperative/CypherdslStatementExecutorIT.java[role=include]

扩展 ReactiveNeo4jRepository 时,请使用 ReactiveCypherdslStatementExecutor

CypherdslStatementExecutorfindOnefindAll 的多个重载一起提供。它们分别采用一个 Cypher-DSL 语句或此语句正在进行的定义作为第一个参数,如果是投影方法,则采用一个类型。

如果查询需要参数,则必须通过 Cypher-DSL 本身定义它们,并且还必须由它填充,如下面的清单所示:

link:example$integration/imperative/CypherdslStatementExecutorIT.java[role=include]
1 动态查询以类型安全的方式在帮助器方法中构建
2 我们在 here 中已经看到了这一点,在其中我们还定义了一些包含模型的变量
3 我们定义了一个匿名参数,由传递给该方法的 name 的实际值填充
4 从帮助器方法返回的语句用于查找实体
5 Or a projection.

findAll 方法的作用与此类似。强制性 Cypher-DSL 语句执行器还提供了一个重载,返回分页结果。