diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java index 82faf4a59..eaf888bd5 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java @@ -15,8 +15,7 @@ */ package org.springframework.data.mongodb.repository.query; -import lombok.Data; -import lombok.RequiredArgsConstructor; +import lombok.Value; import java.util.ArrayList; import java.util.LinkedHashMap; @@ -144,19 +143,24 @@ class ExpressionEvaluatingParameterBinder { while (quotationMark != '\'' && quotationMark != '"') { quotationMarkIndex--; + if (quotationMarkIndex < 0) { throw new IllegalArgumentException("Could not find opening quotes for quoted parameter"); } + quotationMark = buffer.charAt(quotationMarkIndex); } if (valueForBinding.startsWith("{")) { // remove quotation char before the complex object string + buffer.deleteCharAt(quotationMarkIndex); + } else { if (quotationMark == '\'') { buffer.replace(quotationMarkIndex, quotationMarkIndex + 1, "\""); } + buffer.append("\""); } } @@ -220,7 +224,9 @@ class ExpressionEvaluatingParameterBinder { private Pattern createReplacementPattern(List bindings) { StringBuilder regex = new StringBuilder(); + for (ParameterBinding binding : bindings) { + regex.append("|"); regex.append(Pattern.quote(binding.getParameter())); regex.append("['\"]?"); // potential quotation char (as in { foo : '?0' }). @@ -238,10 +244,9 @@ class ExpressionEvaluatingParameterBinder { */ private Placeholder extractPlaceholder(String groupName) { - if (!groupName.endsWith("'") && !groupName.endsWith("\"")) { - return new Placeholder(groupName, false); - } - return new Placeholder(groupName.substring(0, groupName.length() - 1), true); + return !groupName.endsWith("'") && !groupName.endsWith("\"") ? // + Placeholder.of(groupName, false) : // + Placeholder.of(groupName.substring(0, groupName.length() - 1), true); } /** @@ -311,9 +316,11 @@ class ExpressionEvaluatingParameterBinder { private static Map mapBindings(List bindings) { Map map = new LinkedHashMap(bindings.size(), 1); + for (ParameterBinding binding : bindings) { - map.put(new Placeholder(binding.getParameter(), binding.isQuoted()), binding); + map.put(Placeholder.of(binding.getParameter(), binding.isQuoted()), binding); } + return map; } } @@ -324,8 +331,7 @@ class ExpressionEvaluatingParameterBinder { * @author Mark Paluch * @since 1.9 */ - @Data - @RequiredArgsConstructor + @Value(staticConstructor = "of") static class Placeholder { private final String parameter; diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java index a53e3525b..6cfcbfa38 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java @@ -367,6 +367,17 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject().toJson(), is(reference.getQueryObject().toJson())); } + /** + * @see DATAMONGO-1454 + */ + @Test + public void shouldSupportExistsProjection() throws Exception { + + StringBasedMongoQuery mongoQuery = createQueryForMethod("existsByLastname", String.class); + + assertThat(mongoQuery.isExistsQuery(), is(true)); + } + /** * @see DATAMONGO-1565 */ @@ -387,17 +398,6 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject(), is(reference.getQueryObject())); } - /** - * @see DATAMONGO-1454 - */ - @Test - public void shouldSupportExistsProjection() throws Exception { - - StringBasedMongoQuery mongoQuery = createQueryForMethod("existsByLastname", String.class); - - assertThat(mongoQuery.isExistsQuery(), is(true)); - } - /** * @see DATAMONGO-1565 */