diff --git a/pom.xml b/pom.xml
index b6c3e7e1ab..9d5764157e 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-4033-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-benchmarks/pom.xml b/spring-data-mongodb-benchmarks/pom.xml
index c28a240d2c..027fb31a7a 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-4033-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 5dedcf81ed..22f2be282d 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-4033-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index b26a926c7a..0e5201a290 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-4033-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java
index 2a6e7fb4a5..eca25d5ca2 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/convert/QueryMapper.java
@@ -617,7 +617,11 @@ protected Object delegateConvertToMongoType(Object source, @Nullable MongoPersis
}
protected Object convertAssociation(Object source, Field field) {
- return convertAssociation(source, field.getProperty());
+ Object value = convertAssociation(source, field.getProperty());
+ if(value != null && field.isIdField() && field.getFieldType() != value.getClass()) {
+ return convertId(value, field.getFieldType());
+ }
+ return value;
}
/**
@@ -1043,6 +1047,9 @@ public TypeInformation> getTypeHint() {
return ClassTypeInformation.OBJECT;
}
+ public Class> getFieldType() {
+ return Object.class;
+ }
}
/**
@@ -1171,6 +1178,11 @@ private Association findAssociation() {
return null;
}
+ @Override
+ public Class> getFieldType() {
+ return property.getFieldType();
+ }
+
@Override
public String getMappedKey() {
return path == null ? name : path.toDotPath(isAssociation() ? getAssociationConverter() : getPropertyConverter());
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
index d3b73379b2..06f6aec93b 100755
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/QueryMapperUnitTests.java
@@ -437,6 +437,31 @@ void convertsDocumentReferenceOnIdPropertyCorrectly() {
assertThat(mappedQuery).containsEntry("sample", "s1");
}
+ @Test // GH-4033
+ void convertsNestedPathToIdPropertyOfDocumentReferenceCorrectly() {
+
+ Query query = query(where("sample.foo").is("s1"));
+ org.bson.Document mappedQuery = mapper.getMappedObject(query.getQueryObject(),
+ context.getPersistentEntity(WithDocumentReference.class));
+
+ assertThat(mappedQuery).containsEntry("sample", "s1");
+ }
+
+ @Test // GH-4033
+ void convertsNestedPathToIdPropertyOfDocumentReferenceCorrectlyWhenItShouldBeConvertedToObjectId() {
+
+ ObjectId id = new ObjectId();
+ Query query = query(where("sample.foo").is(id.toHexString()));
+ org.bson.Document mappedQuery = mapper.getMappedObject(query.getQueryObject(),
+ context.getPersistentEntity(WithDocumentReference.class));
+
+ assertThat(mappedQuery.get("sample")).satisfies(it -> {
+
+ assertThat(it).isInstanceOf(ObjectId.class);
+ assertThat(((ObjectId) it).toHexString()).isEqualTo(id.toHexString());
+ });
+ }
+
@Test // GH-3853
void convertsListDocumentReferenceOnIdPropertyCorrectly() {