diff --git a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java index 5f6e7153fd..5a4b5fc9ca 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java @@ -27,6 +27,8 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.hibernate.jpa.TypedParameterValue; + import org.springframework.data.repository.query.SpelQueryContext; import org.springframework.data.repository.query.SpelQueryContext.SpelExtractor; import org.springframework.data.repository.query.parser.Part.Type; @@ -48,6 +50,7 @@ * @author Jens Schauder * @author Diego Krupitza * @author Greg Turnquist + * @author Yanming Zhou */ class StringQuery implements DeclaredQuery { @@ -764,6 +767,11 @@ public Type getType() { @Override public Object prepare(@Nullable Object value) { + // unwrap value if necessary, see https://github.com/spring-projects/spring-data-jpa/pull/2461 + if (value instanceof TypedParameterValue) { + value = ((TypedParameterValue) value).getValue(); + } + if (value == null) { return null; } diff --git a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java index 4746f27106..612032979c 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java @@ -22,6 +22,8 @@ import org.assertj.core.api.Assertions; import org.assertj.core.api.SoftAssertions; +import org.hibernate.jpa.TypedParameterValue; +import org.hibernate.type.StringType; import org.junit.jupiter.api.Test; import org.springframework.data.jpa.repository.query.StringQuery.InParameterBinding; import org.springframework.data.jpa.repository.query.StringQuery.LikeParameterBinding; @@ -37,6 +39,7 @@ * @author Nils Borrmann * @author Andriy Redko * @author Diego Krupitza + * @author Yanming Zhou */ class StringQueryUnitTests { @@ -101,6 +104,19 @@ void detectsNamedLikeBindings() { assertThat(binding.getType()).isEqualTo(Type.ENDING_WITH); } + @Test // GH-2548 + void likeParameterBindingShouldUnwrapValueIfNecessary() { + + StringQuery query = new StringQuery("select u from User u where u.firstname like %:firstname%", false); + List bindings = query.getParameterBindings(); + LikeParameterBinding binding = (LikeParameterBinding) bindings.get(0); + + assertThat(binding.prepare("test")).isEqualTo("%test%"); + assertThat(binding.prepare(new TypedParameterValue(StringType.INSTANCE, "test"))).isEqualTo("%test%"); + assertThat(binding.prepare(null)).isNull(); + assertThat(binding.prepare(new TypedParameterValue(StringType.INSTANCE, null))).isNull(); + } + @Test // DATAJPA-461 void detectsNamedInParameterBindings() {