如何解决从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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。