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 c81afb625..a86378e1d 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;