diff --git a/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java b/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java index 7d382a4d0..f1bc0fd5f 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/EscapeCharacter.java @@ -34,30 +34,20 @@ public class EscapeCharacter { private static final List TO_REPLACE = Arrays.asList("_", "%"); - char value; + char escapeCharacter; /** * Escapes all special like characters ({@code _}, {@code %}) using the configured escape character. * - * @param value May be {@literal null}. + * @param value may be {@literal null}. * @return */ @Nullable public String escape(String value) { - if (value == null) { - return null; - } - return TO_REPLACE.stream() // - .reduce(value, (it, character) -> it.replace(character, this.value + character)); - } - - /** - * Makes the underlying character available. - * - * @return the value - */ - public char escapeCharacter() { - return value; + return value == null // + ? null // + : TO_REPLACE.stream() // + .reduce(value, (it, character) -> it.replace(character, this.escapeCharacter + character)); } } diff --git a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java index 76bd83c95..e5bb9cd55 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java @@ -291,7 +291,7 @@ public class JpaQueryCreator extends AbstractQueryCreator stringPath = getTypedPath(root, part); Expression propertyExpression = upperIfIgnoreCase(stringPath); Expression parameterExpression = upperIfIgnoreCase(provider.next(part, String.class).getExpression()); - Predicate like = builder.like(propertyExpression, parameterExpression, escape.getValue()); + Predicate like = builder.like(propertyExpression, parameterExpression, escape.getEscapeCharacter()); return type.equals(NOT_LIKE) || type.equals(NOT_CONTAINING) ? like.not() : like; case TRUE: Expression truePath = getTypedPath(root, part); diff --git a/src/main/java/org/springframework/data/jpa/repository/support/JpaEvaluationContextExtension.java b/src/main/java/org/springframework/data/jpa/repository/support/JpaEvaluationContextExtension.java index 686e430c2..a56867dd1 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/JpaEvaluationContextExtension.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/JpaEvaluationContextExtension.java @@ -15,6 +15,8 @@ */ package org.springframework.data.jpa.repository.support; +import lombok.RequiredArgsConstructor; + import org.springframework.data.jpa.repository.query.EscapeCharacter; import org.springframework.data.spel.spi.EvaluationContextExtension; @@ -26,7 +28,7 @@ import org.springframework.data.spel.spi.EvaluationContextExtension; */ public class JpaEvaluationContextExtension implements EvaluationContextExtension { - private final EscapeCharacter character; + private final JpaRootObject root; /** * Creates a new {@link JpaEvaluationContextExtension} for the given escape character. @@ -34,7 +36,7 @@ public class JpaEvaluationContextExtension implements EvaluationContextExtension * @param escapeCharacter the character to be used to escape parameters for LIKE expression. */ public JpaEvaluationContextExtension(char escapeCharacter) { - this.character = EscapeCharacter.of(escapeCharacter); + this.root = JpaRootObject.of(EscapeCharacter.of(escapeCharacter)); } /* @@ -52,6 +54,32 @@ public class JpaEvaluationContextExtension implements EvaluationContextExtension */ @Override public Object getRootObject() { - return character; + return root; + } + + @RequiredArgsConstructor(staticName = "of") + public static class JpaRootObject { + + private final EscapeCharacter character; + + /** + * Escapes the given source {@link String} for LIKE expressions. + * + * @param source can be {@literal null}. + * @return + * @see EscapeCharacter#escape(String) + */ + public String escape(String source) { + return character.escape(source); + } + + /** + * Returns the escape character being used to escape special characters for LIKE expressions. + * + * @return + */ + public char escapeCharacter() { + return character.getEscapeCharacter(); + } } }