从 SDN+OGM 切换到 SDN/RX 时替换 @QueryResult

Replace @QueryResult while switching from SDN+OGM to SDN/RX

使用 Spring Boot 2.3.4,我一直在使用 @QueryResult 注释将一些自定义 Cypher 查询响应映射到 POJO。我现在正在测试 Spring Boot 2.4 first RC,并尝试按照有关如何删除 OGM 的说明进行操作,因为支持已被删除。我成功地用此处提供的注释替换了其他注释: https://neo4j.github.io/sdn-rx/current/#migrating 但我现在只剩下未指定任何内容的 @QueryResult 注释。当我删除它们时,出现映射错误:

org.springframework.data.mapping.MappingException: Could not find mappable nodes or relationships inside Record

我查阅了一些映射解释,但问题是:我的自定义 POJO 不代表数据库中的任何实体,也不代表实体的一部分。它们是来自不同节点的相关位。 让我举例说明: 我想从 a:

中获取作为 MY_REL 关系目标的所有 b 节点
(a:Node {label:"my label"})-[:MY_REL]->(b:Node)

出于我的目的,我不需要在响应中获取 nodes,所以我的 POJO 只有 2 个属性:

我return这个:

RETURN a.label AS source, COLLECT(b.label) AS targets

为了完成映射,我的 POJO 只是用 @QueryResult 注释。 有谁知道如何使用 SB 2.4 候选发布版重现此行为?正如我所说,删除现在有问题的注释会提示我出现映射错误,但我不知道应该如何替换它。

Spring Data Neo4j 6 现在支持与其他 Spring 数据模块一致的投影(以前称为 @QueryResult)。 话虽如此,假设这个 @Query 写在 Neo4jRepository<Node,...> 中,你要做的最简单的事情就是 return 也是 a.

我知道这首先听起来很荒谬但是通过选择存储库抽象,你说在映射阶段应该处理的所有东西都是 Node 并且你想投影它的属性(或子集)进入 POJO(DTO 投影)。 SDN 无法确保您在启动映射时确实使用了正确的类型,因此它会抛出您所面临的异常。 Neo4j-OGM 在映射 @QueryResults 的幕后更加轻松,但不幸的是,这个方向也是错误的。

如果您的用例如您所描述的那样简单,我强烈建议您使用 Neo4jClient(docs),这样您就可以直接访问映射。 它具有流畅的 API 查询和手动映射功能,并且参与正在进行的 Spring 事务,您的存储库 运行 位于其中。

里面有很多关于投影的内容,所以我建议也阅读 the section in the documentation