diff --git a/ci/test.sh b/ci/test.sh
index ea820843d..c60e198c2 100755
--- a/ci/test.sh
+++ b/ci/test.sh
@@ -6,7 +6,7 @@ mkdir -p /tmp/jenkins-home
export JENKINS_USER=${JENKINS_USER_NAME}
export SDN_FORCE_REUSE_OF_CONTAINERS=true
-export SDN_NEO4J_VERSION=5.26.2
+export SDN_NEO4J_VERSION=5.26.12
MAVEN_OPTS="-Duser.name=${JENKINS_USER} -Duser.home=/tmp/jenkins-home -Dscan=false" \
./mvnw -s settings.xml -P${PROFILE} clean dependency:list verify -Dsort -U -B -Dmaven.repo.local=/tmp/jenkins-home/.m2/spring-data-neo4j -Ddevelocity.storage.directory=/tmp/jenkins-home/.develocity-root
diff --git a/pom.xml b/pom.xml
index 923e8fe67..2013e7a9a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -75,7 +75,7 @@
1.0.8.RELEASE
${skipTests}
8.40
- 2024.5.1
+ 2025.2.2
spring-data-neo4j
SDNEO4J
1.7.0
@@ -91,7 +91,7 @@
${java.version}
5.28.10
2.17.3
- 4.4.41
+ 5.26.12
3.0.1
${project.build.directory}/docs
UTF-8
diff --git a/src/main/java/org/springframework/data/neo4j/core/DynamicLabels.java b/src/main/java/org/springframework/data/neo4j/core/DynamicLabels.java
index b9db66e19..549cd76b1 100644
--- a/src/main/java/org/springframework/data/neo4j/core/DynamicLabels.java
+++ b/src/main/java/org/springframework/data/neo4j/core/DynamicLabels.java
@@ -52,11 +52,13 @@ final class DynamicLabels implements UnaryOperator {
public OngoingMatchAndUpdate apply(OngoingMatchAndUpdate ongoingMatchAndUpdate) {
OngoingMatchAndUpdate decoratedMatchAndUpdate = ongoingMatchAndUpdate;
- if (!oldLabels.isEmpty()) {
- decoratedMatchAndUpdate = decoratedMatchAndUpdate.remove(rootNode, oldLabels.toArray(new String[0]));
+ if (!this.oldLabels.isEmpty()) {
+ decoratedMatchAndUpdate = decoratedMatchAndUpdate.remove(this.rootNode,
+ Cypher.allLabels(Cypher.anonParameter(this.oldLabels)));
}
- if (!newLabels.isEmpty()) {
- decoratedMatchAndUpdate = decoratedMatchAndUpdate.set(rootNode, newLabels.toArray(new String[0]));
+ if (!this.newLabels.isEmpty()) {
+ decoratedMatchAndUpdate = decoratedMatchAndUpdate.set(this.rootNode,
+ Cypher.allLabels(Cypher.anonParameter(this.newLabels)));
}
return decoratedMatchAndUpdate;
}
diff --git a/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java b/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java
index 992e36662..d64305b62 100644
--- a/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java
+++ b/src/main/java/org/springframework/data/neo4j/core/Neo4jTemplate.java
@@ -452,10 +452,12 @@ private T saveImpl(T instance, @Nullable Collection) entityToBeSaved.getClass())
);
+ Statement statement = cypherGenerator.prepareSaveOf(entityMetaData, dynamicLabels, TemplateSupport.rendererRendersElementId(renderer));
Optional newOrUpdatedNode = neo4jClient
- .query(() -> renderer.render(cypherGenerator.prepareSaveOf(entityMetaData, dynamicLabels, TemplateSupport.rendererRendersElementId(renderer))))
+ .query(() -> renderer.render(statement))
.bind(entityToBeSaved)
.with(binderFunction)
+ .bindAll(statement.getCatalog().getParameters())
.fetchAs(Entity.class)
.one();
@@ -496,11 +498,13 @@ private DynamicLabels determineDynamicLabels(T entityToBeSaved, Neo4jPersist
PersistentPropertyAccessor propertyAccessor = entityMetaData.getPropertyAccessor(entityToBeSaved);
Neo4jPersistentProperty idProperty = entityMetaData.getRequiredIdProperty();
+ var statementReturningDynamicLabels = cypherGenerator.createStatementReturningDynamicLabels(entityMetaData);
Neo4jClient.RunnableSpec runnableQuery = neo4jClient
- .query(() -> renderer.render(cypherGenerator.createStatementReturningDynamicLabels(entityMetaData)))
+ .query(() -> renderer.render(statementReturningDynamicLabels))
.bind(convertIdValues(idProperty, propertyAccessor.getProperty(idProperty)))
.to(Constants.NAME_OF_ID).bind(entityMetaData.getStaticLabels())
- .to(Constants.NAME_OF_STATIC_LABELS_PARAM);
+ .to(Constants.NAME_OF_STATIC_LABELS_PARAM)
+ .bindAll(statementReturningDynamicLabels.getCatalog().getParameters());
if (entityMetaData.hasVersionProperty()) {
runnableQuery = runnableQuery
@@ -579,9 +583,11 @@ class Tuple3 {
binderFunction = TemplateSupport.createAndApplyPropertyFilter(pps, entityMetaData, binderFunction);
List