diff --git a/pom.xml b/pom.xml
index 79e5353b7f..14bd6fdac7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.0.0-SNAPSHOT
+ 4.0.0-GH-4037-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index c28a240d2c..523df6dc6d 100644
--- a/spring-data-mongodb-benchmarks/pom.xml
+++ b/spring-data-mongodb-benchmarks/pom.xml
@@ -7,7 +7,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.0.0-SNAPSHOT
+ 4.0.0-GH-4037-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 5dedcf81ed..d01e780c11 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -15,7 +15,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.0.0-SNAPSHOT
+ 4.0.0-GH-4037-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index b26a926c7a..a892f9368a 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -12,7 +12,7 @@
org.springframework.data
spring-data-mongodb-parent
- 4.0.0-SNAPSHOT
+ 4.0.0-GH-4037-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java
index 377a985392..69a22f3fdd 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializer.java
@@ -22,7 +22,6 @@
import java.util.regex.Pattern;
import org.bson.Document;
-
import org.springframework.data.mapping.context.MappingContext;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.convert.QueryMapper;
@@ -158,8 +157,20 @@ protected Object convert(@Nullable Path> path, @Nullable Constant> constant)
MongoPersistentProperty property = getPropertyFor(path);
- return property.isIdProperty() ? asReference(constant.getConstant(), path.getMetadata().getParent())
- : asReference(constant.getConstant(), path);
+ if (property.isDocumentReference()) {
+ return converter.toDocumentPointer(constant.getConstant(), property).getPointer();
+ }
+
+ if (property.isIdProperty()) {
+
+ MongoPersistentProperty propertyForPotentialDbRef = getPropertyForPotentialDbRef(path);
+ if (propertyForPotentialDbRef != null && propertyForPotentialDbRef.isDocumentReference()) {
+ return converter.toDocumentPointer(constant.getConstant(), propertyForPotentialDbRef).getPointer();
+ }
+ return asReference(constant.getConstant(), path.getMetadata().getParent());
+ }
+
+ return asReference(constant.getConstant(), path);
}
@Nullable
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java
index 49c2d3a798..46fe10e3a1 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/support/SpringDataMongodbSerializerUnitTests.java
@@ -50,6 +50,7 @@
import com.querydsl.core.types.dsl.PathBuilder;
import com.querydsl.core.types.dsl.SimplePath;
import com.querydsl.core.types.dsl.StringPath;
+import org.springframework.data.mongodb.repository.User;
/**
* Unit tests for {@link SpringDataMongodbSerializer}.
@@ -225,6 +226,26 @@ void chainMultipleAndFlattensCorrectly() {
assertThat(serializer.handle(testExpression)).isEqualTo(expected);
}
+ @Test // GH-4037
+ void parsesDocumentReference() {
+
+ User user = new User();
+ user.setId("007");
+ Predicate predicate = QPerson.person.spiritAnimal.eq(user);
+
+ assertThat(serializer.handle(predicate)).isEqualTo(Document.parse("{ 'spiritAnimal' : '007' }"));
+ }
+
+ @Test // GH-4037
+ void parsesDocumentReferenceOnId() {
+
+ User user = new User();
+ user.setId("007");
+ Predicate predicate = QPerson.person.spiritAnimal.id.eq("007");
+
+ assertThat(serializer.handle(predicate)).isEqualTo(Document.parse("{ 'spiritAnimal' : '007' }"));
+ }
+
class Address {
String id;
String street;