diff --git a/src/main/java/org/springframework/data/neo4j/repository/query/FluentQuerySupport.java b/src/main/java/org/springframework/data/neo4j/repository/query/FluentQuerySupport.java index 59fdb4404..1fecad040 100644 --- a/src/main/java/org/springframework/data/neo4j/repository/query/FluentQuerySupport.java +++ b/src/main/java/org/springframework/data/neo4j/repository/query/FluentQuerySupport.java @@ -15,7 +15,6 @@ */ package org.springframework.data.neo4j.repository.query; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.HashSet; @@ -126,7 +125,7 @@ abstract class FluentQuerySupport { Set allPaths = new HashSet<>(); for (String property : projectingProperties) { if (property.contains(".")) { - allPaths.addAll(Arrays.stream(property.split("\\.")).toList()); + allPaths.add(property.substring(0, property.lastIndexOf("."))); } allPaths.add(property); } diff --git a/src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java b/src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java index 9ddaf3c17..c5444cea2 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java +++ b/src/test/java/org/springframework/data/neo4j/integration/imperative/RepositoryIT.java @@ -2793,6 +2793,7 @@ class RepositoryIT { CREATE (f2) -[:ARRIVES] ->(cdg) CREATE (f3) -[:DEPARTS] ->(lax) CREATE (f3) -[:ARRIVES] ->(lhr) + CREATE (f1) -[:NEXT_FLIGHT] ->(f2) -[:NEXT_FLIGHT] ->(f3) """); } @@ -2882,6 +2883,22 @@ class RepositoryIT { }); } + @Test + void findAllByExampleFluentCyclicRelationships(@Autowired FlightRepository repository) { + Example example = Example.of(new Flight("FL 001", null, null), + ExampleMatcher.matchingAll().withIgnoreNullValues()); + List flights = repository.findBy(example, + q -> q.project("name", "nextFlight.name", "nextFlight.nextFlight.name").all()); + + assertThat(flights) + .hasSize(1) + .first().satisfies(p -> { + assertThat(p.getName()).isEqualTo("FL 001"); + assertThat(p.getNextFlight().getName()).isEqualTo("FL 002"); + assertThat(p.getNextFlight().getNextFlight().getName()).isEqualTo("FL 003"); + }); + } + @Test // GH-2343 void findAllByExampleFluentAs(@Autowired PersonRepository repository) { diff --git a/src/test/java/org/springframework/data/neo4j/integration/shared/common/Flight.java b/src/test/java/org/springframework/data/neo4j/integration/shared/common/Flight.java index 9c454bbc5..9f50e9e66 100644 --- a/src/test/java/org/springframework/data/neo4j/integration/shared/common/Flight.java +++ b/src/test/java/org/springframework/data/neo4j/integration/shared/common/Flight.java @@ -57,4 +57,12 @@ public class Flight { public Airport getArrival() { return arrival; } + + public Flight getNextFlight() { + return this.nextFlight; + } + + public void setNextFlight(Flight nextFlight) { + this.nextFlight = nextFlight; + } }