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

问题描述

在Spring Boot 2.3.4之前,我一直在使用@QueryResult批注将一些自定义Cypher查询响应映射到POJO。我现在正在测试Spring Boot 2.4的第一个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

我已经查看了一些Mapping的解释,但问题是这样的:我的自定义POJO既不代表数据库中的任何实体,也不代表实体的一部分。它们是来自不同节点的相关位。 让我举例说明: 我想从a:获取所有作为MY_REL关系目标的b节点:

(a:Node {label:"my label"})-[:MY_REL]->(b:Node)

出于我的目的,我不需要在响应中获取 nodes ,因此我的POJO仅具有2个属性

  • “源”字符串,它是开始节点的标签
  • “目标”字符串集,它是端节点标签的列表

然后我返回:

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

我的POJO只需使用@QueryResult注释即可完成映射。 有谁知道如何用SB 2.4版本候选重现此行为?如我所说,删除现在有问题的注释会提示我“映射”错误,但我不知道该怎么做。

解决方法

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

我知道这听起来很荒谬,但是选择存储库抽象后,您说在映射阶段应该处理的所有内容都是Node,并且您要将其属性(或子集)投影到POJO(DTO投影)。 SDN在启动映射时无法确保您使用的类型正确,因此会引发您面临的异常。 Neo4j-OGM在幕后更加轻松地绘制了@QueryResult的地图,但不幸的是,这个方向也不对。

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

关于投影,里面有很多东西,所以我建议您也阅读the section in the documentation