Skip to content

Commit 2225187

Browse files
committed
LikeParameterBinding should unwrap value if necessary
Fix GH-2548
1 parent b8c9c46 commit 2225187

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

src/main/java/org/springframework/data/jpa/repository/query/StringQuery.java

+8
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
import java.util.regex.Matcher;
2828
import java.util.regex.Pattern;
2929

30+
import org.hibernate.jpa.TypedParameterValue;
31+
3032
import org.springframework.data.repository.query.SpelQueryContext;
3133
import org.springframework.data.repository.query.SpelQueryContext.SpelExtractor;
3234
import org.springframework.data.repository.query.parser.Part.Type;
@@ -48,6 +50,7 @@
4850
* @author Jens Schauder
4951
* @author Diego Krupitza
5052
* @author Greg Turnquist
53+
* @author Yanming Zhou
5154
*/
5255
class StringQuery implements DeclaredQuery {
5356

@@ -764,6 +767,11 @@ public Type getType() {
764767
@Override
765768
public Object prepare(@Nullable Object value) {
766769

770+
// unwrap value if necessary, see https://github.com/spring-projects/spring-data-jpa/pull/2461
771+
if (value instanceof TypedParameterValue) {
772+
value = ((TypedParameterValue) value).getValue();
773+
}
774+
767775
if (value == null) {
768776
return null;
769777
}

src/test/java/org/springframework/data/jpa/repository/query/StringQueryUnitTests.java

+16
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
import org.assertj.core.api.Assertions;
2424
import org.assertj.core.api.SoftAssertions;
25+
import org.hibernate.jpa.TypedParameterValue;
26+
import org.hibernate.type.StringType;
2527
import org.junit.jupiter.api.Test;
2628
import org.springframework.data.jpa.repository.query.StringQuery.InParameterBinding;
2729
import org.springframework.data.jpa.repository.query.StringQuery.LikeParameterBinding;
@@ -37,6 +39,7 @@
3739
* @author Nils Borrmann
3840
* @author Andriy Redko
3941
* @author Diego Krupitza
42+
* @author Yanming Zhou
4043
*/
4144
class StringQueryUnitTests {
4245

@@ -101,6 +104,19 @@ void detectsNamedLikeBindings() {
101104
assertThat(binding.getType()).isEqualTo(Type.ENDING_WITH);
102105
}
103106

107+
@Test // GH-2548
108+
void namedLikeBindingsShouldUnwrapValueIfNecessary() {
109+
110+
StringQuery query = new StringQuery("select u from User u where u.firstname like %:firstname%", false);
111+
List<ParameterBinding> bindings = query.getParameterBindings();
112+
LikeParameterBinding binding = (LikeParameterBinding) bindings.get(0);
113+
114+
assertThat(binding.prepare("test")).isEqualTo("%test%");
115+
assertThat(binding.prepare(new TypedParameterValue(StringType.INSTANCE, "test"))).isEqualTo("%test%");
116+
assertThat(binding.prepare(null)).isNull();
117+
assertThat(binding.prepare(new TypedParameterValue(StringType.INSTANCE, null))).isNull();
118+
}
119+
104120
@Test // DATAJPA-461
105121
void detectsNamedInParameterBindings() {
106122

0 commit comments

Comments
 (0)