diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java index 850cafea0..88f56656e 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/util/json/ParameterBindingJsonReader.java @@ -70,8 +70,13 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { private static final Pattern PARAMETER_BINDING_PATTERN = Pattern.compile("\\?(\\d+)"); private static final Pattern EXPRESSION_BINDING_PATTERN = Pattern.compile("[\\?:][#$]\\{.*\\}"); private static final Pattern SPEL_PARAMETER_BINDING_PATTERN = Pattern.compile("('\\?(\\d+)'|\\?(\\d+))"); + private static final String QUOTE_START = "\\Q"; + private static final String ESCAPED_QUOTE_START = "\\" + QUOTE_START; + private static final String QUOTE_REPLACEMENT_QUOTE_START = Matcher.quoteReplacement(ESCAPED_QUOTE_START); private static final String QUOTE_END = "\\E"; + private static final String ESCAPED_QUOTE_END = "\\" + QUOTE_END; + private static final String QUOTE_REPLACEMENT_QUOTE_END = Matcher.quoteReplacement(ESCAPED_QUOTE_END); private final ParameterBindingContext bindingContext; @@ -423,7 +428,7 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { Matcher regexMatcher = EXPRESSION_BINDING_PATTERN.matcher(computedValue); - while (regexMatcher.find()) { + if (regexMatcher.find()) { String binding = regexMatcher.group(); String expression = binding.substring(3, binding.length() - 1); @@ -463,8 +468,8 @@ public class ParameterBindingJsonReader extends AbstractBsonReader { String bindValue = nullSafeToString(getBindableValueForIndex(index)); if(isQuoted(tokenValue)) { - bindValue = bindValue.replaceAll("\\%s".formatted(QUOTE_START), Matcher.quoteReplacement("\\%s".formatted(QUOTE_START))) // - .replaceAll("\\%s".formatted(QUOTE_END), Matcher.quoteReplacement("\\%s".formatted(QUOTE_END))); + bindValue = bindValue.replaceAll(ESCAPED_QUOTE_START, QUOTE_REPLACEMENT_QUOTE_START) // + .replaceAll(ESCAPED_QUOTE_END, QUOTE_REPLACEMENT_QUOTE_END); } computedValue = computedValue.replace(group, bindValue); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index cdcecc8a6..e7a73dafb 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -826,7 +826,7 @@ public abstract class AbstractPersonRepositoryIntegrationTests implements Dirtie assertThat(result.get(0)).isEqualTo(dave); } - @Test // DATAMONGO-770 + @Test void findByFirstnameStartingWith() { String inputString = "\\E.*\\Q";