【问题标题】:Replace @QueryResult while switching from SDN+OGM to SDN/RX从 SDN+OGM 切换到 SDN/RX 时替换 @QueryResult
【发布时间】:2021-02-19 09:31:35
【问题描述】:

在 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 a.label AS source, COLLECT(b.label) AS targets

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

【问题讨论】:

    标签: java spring-boot neo4j spring-data-neo4j neo4j-ogm


    【解决方案1】:

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

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

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

    其中有很多关于预测的内容,所以我建议您也阅读the section in the documentation

    【讨论】:

    • 非常感谢,抱歉回复延迟,我一直在花时间尝试。使用 neo4j 客户端和自定义映射器似乎确实可以解决问题,所以感谢您指出我这个方向!我现在有点困扰,因为现在我的部分查询仍在存储库中(不需要映射),其余的是带有一堆参数的字符串查询,但至少它似乎有效,所以再次感谢!
    猜你喜欢
    • 2017-05-24
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    相关资源
    最近更新 更多