diff --git a/pom.xml b/pom.xml
index 88a3ce592b..34435bf009 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,7 +18,7 @@
org.springframework.data
spring-data-neo4j-parent
- 5.3.0.BUILD-SNAPSHOT
+ 5.3.0.DATAGRAPH-1286-SNAPSHOT
pom
Spring Data Neo4j
diff --git a/spring-data-neo4j-distribution/pom.xml b/spring-data-neo4j-distribution/pom.xml
index 5d55d528f7..be5c6f7ff3 100644
--- a/spring-data-neo4j-distribution/pom.xml
+++ b/spring-data-neo4j-distribution/pom.xml
@@ -14,7 +14,7 @@
org.springframework.data
spring-data-neo4j-parent
- 5.3.0.BUILD-SNAPSHOT
+ 5.3.0.DATAGRAPH-1286-SNAPSHOT
../pom.xml
diff --git a/spring-data-neo4j/pom.xml b/spring-data-neo4j/pom.xml
index 7c80070248..3af2debba0 100644
--- a/spring-data-neo4j/pom.xml
+++ b/spring-data-neo4j/pom.xml
@@ -27,7 +27,7 @@
org.springframework.data
spring-data-neo4j-parent
- 5.3.0.BUILD-SNAPSHOT
+ 5.3.0.DATAGRAPH-1286-SNAPSHOT
../pom.xml
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentProperty.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentProperty.java
index b26d9315f8..74b60826a1 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentProperty.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/mapping/Neo4jPersistentProperty.java
@@ -143,6 +143,13 @@ public boolean isIdProperty() {
return propertyType.idProperty;
}
+ /**
+ * @return True if this property describes the internal ID property.
+ */
+ public boolean isInternalIdProperty() {
+ return propertyType == PropertyType.INTERNAL_ID_PROPERTY;
+ }
+
PropertyType getPropertyType() {
return propertyType;
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/FilterBuildersDefinition.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/FilterBuildersDefinition.java
index 231d6b502a..dd04b1f8ad 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/FilterBuildersDefinition.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/FilterBuildersDefinition.java
@@ -18,9 +18,13 @@
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
+import java.util.function.Predicate;
import org.neo4j.ogm.cypher.BooleanOperator;
import org.neo4j.ogm.cypher.Filters;
+import org.springframework.data.mapping.PersistentPropertyPath;
+import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
+import org.springframework.data.neo4j.mapping.Neo4jPersistentProperty;
import org.springframework.data.neo4j.repository.query.filter.FilterBuilder;
import org.springframework.data.repository.query.parser.Part;
@@ -39,17 +43,24 @@ class FilterBuildersDefinition {
private final Part basePart;
private final List filterBuilders;
+ private final Predicate isInternalIdProperty;
- static UnstartedBuild forType(Class> entityType) {
- return new UnstartedBuild(entityType);
+ static UnstartedBuild forType(Neo4jMappingContext mappingContext, Class> entityType) {
+ return new UnstartedBuild(mappingContext, entityType);
}
- private FilterBuildersDefinition(Class> entityType, Part basePart) {
+ private FilterBuildersDefinition(Neo4jMappingContext mappingContext, Class> entityType, Part basePart) {
this.entityType = entityType;
this.basePart = basePart;
this.filterBuilders = new LinkedList<>();
-
- this.filterBuilders.add(FilterBuilder.forPartAndEntity(basePart, entityType, BooleanOperator.NONE));
+ this.isInternalIdProperty = part -> {
+ PersistentPropertyPath path = mappingContext
+ .getPersistentPropertyPath(part.getProperty());
+ Neo4jPersistentProperty possibleIdProperty = path.getRequiredLeafProperty();
+ return possibleIdProperty.isInternalIdProperty();
+ };
+ this.filterBuilders.add(FilterBuilder.forPartAndEntity(basePart, entityType, BooleanOperator.NONE,
+ isInternalIdProperty));
}
TemplatedQuery buildTemplatedQuery() {
@@ -66,24 +77,28 @@ Part getBasePart() {
}
FilterBuildersDefinition and(Part part) {
- this.filterBuilders.add(FilterBuilder.forPartAndEntity(part, entityType, BooleanOperator.AND));
+ this.filterBuilders.add(FilterBuilder.forPartAndEntity(part, entityType, BooleanOperator.AND, isInternalIdProperty));
return this;
}
FilterBuildersDefinition or(Part part) {
- this.filterBuilders.add(FilterBuilder.forPartAndEntity(part, entityType, BooleanOperator.OR));
+ this.filterBuilders.add(FilterBuilder.forPartAndEntity(part, entityType, BooleanOperator.OR, isInternalIdProperty));
return this;
}
static class UnstartedBuild {
+
+ private final Neo4jMappingContext mappingContext;
+
private final Class> entityType;
- UnstartedBuild(Class> entityType) {
+ UnstartedBuild(Neo4jMappingContext mappingContext, Class> entityType) {
+ this.mappingContext = mappingContext;
this.entityType = entityType;
}
FilterBuildersDefinition startWith(Part firstPart) {
- return new FilterBuildersDefinition(entityType, firstPart);
+ return new FilterBuildersDefinition(mappingContext, entityType, firstPart);
}
}
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphQueryMethod.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphQueryMethod.java
index 7c2b0ca501..4b4c0a2a0c 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphQueryMethod.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/GraphQueryMethod.java
@@ -118,19 +118,6 @@ private Integer getQueryDepthParamIndex(Method method) {
}
}
}
- /*
- //Java 8 only
- Parameter[] parameters = method.getParameters();
- for (int i = 0; i < method.getParameterCount(); i++) {
- if (parameters[i].isAnnotationPresent(Depth.class)) {
- if (parameters[i].getType() == Integer.class || parameters[i].getType() == int.class) {
- return i;
- }
- else {
- throw new IllegalArgumentException("Depth parameter in " + method.getName() + " must be an integer");
- }
- }
- }*/
return null;
}
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/PartTreeNeo4jQuery.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/PartTreeNeo4jQuery.java
index aa0e05921e..5b848844b4 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/PartTreeNeo4jQuery.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/PartTreeNeo4jQuery.java
@@ -22,6 +22,7 @@
import org.neo4j.ogm.session.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
import org.springframework.data.repository.query.RepositoryQuery;
import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.repository.query.parser.PartTree;
@@ -49,11 +50,11 @@ public PartTreeNeo4jQuery(GraphQueryMethod graphQueryMethod, MetaData metaData,
super(graphQueryMethod, metaData, session);
Class> domainType = graphQueryMethod.getEntityInformation().getJavaType();
-
this.graphQueryMethod = graphQueryMethod;
this.tree = new PartTree(graphQueryMethod.getName(), domainType);
- this.queryTemplate = new TemplatedQueryCreator(this.tree, domainType).createQuery();
+ this.queryTemplate = new TemplatedQueryCreator(this.tree,
+ (Neo4jMappingContext) this.graphQueryMethod.getMappingContext(), domainType).createQuery();
}
@Override
diff --git a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/TemplatedQueryCreator.java b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/TemplatedQueryCreator.java
index b278d469ef..773e08cebc 100644
--- a/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/TemplatedQueryCreator.java
+++ b/spring-data-neo4j/src/main/java/org/springframework/data/neo4j/repository/query/TemplatedQueryCreator.java
@@ -19,6 +19,7 @@
import java.util.Optional;
import org.springframework.data.domain.Sort;
+import org.springframework.data.neo4j.mapping.Neo4jMappingContext;
import org.springframework.data.repository.query.parser.AbstractQueryCreator;
import org.springframework.data.repository.query.parser.Part;
import org.springframework.data.repository.query.parser.PartTree;
@@ -33,17 +34,19 @@
*/
class TemplatedQueryCreator extends AbstractQueryCreator {
+ private final Neo4jMappingContext mappingContext;
private final Class> entityType;
- public TemplatedQueryCreator(PartTree tree, Class> entityType) {
+ public TemplatedQueryCreator(PartTree tree, Neo4jMappingContext mappingContext, Class> entityType) {
super(tree);
+ this.mappingContext = mappingContext;
this.entityType = entityType;
}
@Override
protected FilterBuildersDefinition create(Part part, Iterator