【问题标题】:How to iterate from QueryResultBuilder using COLLECT() with Cypher如何使用带有 Cypher 的 COLLECT() 从 QueryResultBuilder 进行迭代
【发布时间】:2025-12-04 21:15:03
【问题描述】:

我正在使用 Spring Neo4j 3.3 版本并通过密码创建实体。我有 Repo 类,我想在其中获取以下内容,但出现错误

原因:java.lang.RuntimeException:无法从具有多个元素的 Iterable 中提取单个值。 在 org.springframework.data.neo4j.conversion.DefaultConverter.extractSingle(DefaultConverter.java:61) ~[spring-data-neo4j-3.3.0.RELEASE.jar:na] 在 org.springframework.data.neo4j.conversion.DefaultConverter.extractValue(DefaultConverter.java:52) ~[spring-data-neo4j-3.3.0.RELEASE.jar:na] 在 org.springframework.data.neo4j.conversion.DefaultConverter.convert(DefaultConverter.java:41) ~[spring-data-neo4j-3.3.0.RELEASE.jar:na] 在 org.springframework.data.neo4j.support.conversion.EntityResultConverter.convert(EntityResultConverter.java:165) ~[spring-data-neo4j-3.3.0.RELEASE.jar:na] 在 org.springframework.data.neo4j.conversion.QueryResultBuilder$1.underlyingObjectToObject(QueryResultBuilder.java:86) ~[spring-data-neo4j-3.3.0.RELEASE.jar:na]

ReservRepo

@Query("MATCH (guest:Guest)-[rel:GUEST_RESV]->(reserv:Reserv)-[histRel:RESV_HISTORY]->(resvhistory:ReservHistory) WHERE reserv.id={0} "
            + "  Return guest , COLLECT(resvhistory) as history ")

Collection<GuestHistory> getGuestReservationHist(String reservId);

    @QueryResult
    public interface GuestHistory {

        @ResultColumn("guest")
        GuestProfile getGuest();

        @ResultColumn("history")
        List<ReservHistory> getHistory();


    }

/* Fetching Guest History object */ 
Iterator<GuestHistory> iterator = historyObj.iterator();
        while (iterator.hasNext()) {
            GuestHistory hist = iterator.next();
            reservation.setGuest_firstName(hist.getGuest().getFirstName());
            reservation.setGuest_lastName(hist.getGuest().getLastName());
            reservation.setGuest_mobile(hist.getGuest().getMobile());
            reservation.setGuest_email(hist.getGuest().getEmailId());
            reservation.setVIP(hist.getGuest().getIsVip());
            for(ReservHistory history:hist.getHistory()){ /*hist.getHistory() :Error*/                                                                 
                System.out.println("---history---"+history);
            }
            resevation.add(reservation);

        }

请告诉我如何从这里开始,或者请分享任何例子

【问题讨论】:

  • Cypher 返回的不是不止一行吗?
  • 是的,这个密码返回不止一行。
  • 您是否尝试使用List&lt;ReservationHistory&gt; getHistory() 而不是Iterable&lt;ReservationHistory&gt; getHistory()
  • 不走运...我关注了*.com/questions/20705762/…。在这里,我可以获取 Guest 对象但无法获取 Collection 。
  • 它适用于 Spring Data Neo4j 3.4.0.M1 和 Neo4j 2.2.2

标签: spring neo4j spring-data-neo4j


【解决方案1】:

Cypher 查询返回不止一行,但您要求 SDN 将其映射到单个 GuestHistory。试试

@Query("MATCH (guest:Guest)-[rel:GUEST_RESV]->(reserv:Reserv)-[histRel:RESV_HISTORY]->(resvhistory:ReservHistory) WHERE reserv.id={0} "
            + "  Return guest , COLLECT(resvhistory) as history ")
Collection<GuestHistory> getGuestReservationHist(String reservId);

【讨论】:

  • **仍然得到与 java.lang.RuntimeException 相同的错误:无法从具有多个元素的 Iterable 中提取单个值。 ** 迭代器 迭代器 = historyObj.iterator(); while (iterator.hasNext()) { GuestHistory hist = iterator.next(); Listhist.getHistory());//抛出错误 }
  • 请发布完整的堆栈跟踪和代码中该异常源自的行
  • 使用完整的堆栈跟踪和发生异常的代码行编辑帖子。我在 google 上阅读了不同的帖子,发现这是 Spring data Neo4J 3.3 中的一个错误。可能有其他一些机制可以使其相同但不知道 :)