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 44d5e10f45..6a33d7f9c9 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 @@ -1233,6 +1233,18 @@ private PersistentPropertyPath getPath(String pathExpre String rawPath = removePlaceholders(POSITIONAL_OPERATOR, removePlaceholders(DOT_POSITIONAL_PATTERN, pathExpression)); + // fix xx.11.22.33 becomes xx3, it should be xx.33, then path should be null. (test mapNestedLastBigIntegerFieldCorrectly) + if (pathExpression.contains(".")) { + String lastDotString = pathExpression.substring(pathExpression.lastIndexOf(".")); + int lastDotLength = lastDotString.length(); + int newLength = 0; + if (rawPath.contains(".")) { + newLength = rawPath.substring(rawPath.lastIndexOf(".")).length(); + } + if (lastDotLength != newLength) { + rawPath = rawPath.substring(0, rawPath.length() - 1) + lastDotString; + } + } if (sourceProperty != null && sourceProperty.getOwner().equals(entity)) { return mappingContext.getPersistentPropertyPath( diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java index 2932873ceb..49416dbae2 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/convert/UpdateMapperUnitTests.java @@ -1217,6 +1217,16 @@ void mapNestedIntegerFieldCorrectly() { assertThat(mappedUpdate).isEqualTo(new org.bson.Document("$set", new org.bson.Document("levelOne.0.1.3", "4"))); } + @Test + void mapNestedLastBigIntegerFieldCorrectly() { + + Update update = new Update().set("levelOne.0.1.32", "4"); + Document mappedUpdate = mapper.getMappedObject(update.getUpdateObject(), + context.getPersistentEntity(EntityWithNestedMap.class)); + + assertThat(mappedUpdate).isEqualTo(new org.bson.Document("$set", new org.bson.Document("levelOne.0.1.32", "4"))); + } + @Test // GH-3775 void mapNestedMixedStringIntegerFieldCorrectly() { @@ -1732,6 +1742,8 @@ static class UnwrappableType { static class EntityWithNestedMap { Map>> levelOne; + // for test mapNestedLastBigIntegerFieldCorrectly() + Map>> levelOne2; } static class Customer {