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 492a505ba..68fd99bcc 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 @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Map.Entry; import java.util.Optional; import java.util.Set; +import java.util.regex.Pattern; import org.bson.BsonValue; import org.bson.Document; @@ -1064,6 +1065,11 @@ public class QueryMapper { private PropertyPath forName(String path) { try { + + if (entity.getPersistentProperty(path) != null) { + return PropertyPath.from(Pattern.quote(path), entity.getTypeInformation()); + } + return PropertyPath.from(path, entity.getTypeInformation()); } catch (PropertyReferenceException | InvalidPersistentPropertyPath e) { 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 23b184815..bff4ad240 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 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; +import org.bson.types.Code; import org.bson.types.ObjectId; import org.junit.Before; import org.junit.Test; @@ -856,6 +857,15 @@ public class QueryMapperUnitTests { assertThat(document).isEqualTo(new org.bson.Document("nested.unresolvablePath.id", idHex)); } + @Test // DATAMONGO-2339 + public void findByIdUsesMappedIdFieldNameWithUnderscoreCorrectly() { + + org.bson.Document target = mapper.getMappedObject(new org.bson.Document("with_underscore", "id-1"), + context.getPersistentEntity(WithIdPropertyContainingUnderscore.class)); + + assertThat(target).isEqualTo(new org.bson.Document("_id", "id-1")); + } + @Document public class Foo { @Id private ObjectId id; @@ -979,4 +989,8 @@ public class QueryMapperUnitTests { static class EntityWithComplexValueTypeList { List list; } + + static class WithIdPropertyContainingUnderscore { + @Id String with_underscore; + } }