在从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)

出于我的目的,我不需要在响应中获得节点,所以我的POJO只有两个属性:

  • a";源";作为开始节点标签的字符串
  • a";目标";字符串集,它是结束节点标签的列表

并且我返回这个:

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在绘制@QueryResults的幕后更为轻松,但不幸的是,这个方向也错了。

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

当涉及到预测时,有很多内容,所以我建议也阅读文档中的部分。

最新更新