问题描述
在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。