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() {