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 eef1ce951..d23a521c5 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 @@ -165,7 +165,7 @@ class StringQuery { builder.append("("); builder.append("%?(\\?(\\d+))%?"); // position parameter builder.append("|"); // or - builder.append("%?(:(\\w+))%?"); // named parameter; + builder.append("%?(:([\\p{L}\\w]+))%?"); // named parameter; builder.append(")"); builder.append("\\)?"); // optional braces around paramters 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 6db2514a4..b7aeae944 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 @@ -246,6 +246,62 @@ public class StringQueryUnitTests { query.getBindingFor(null); } + /** + * @see DATAJPA-545 + */ + @Test + public void detectsInBindingWithSpecialFrenchCharactersInParentheses() { + + StringQuery query = new StringQuery("select * from MyEntity where abonnés in (:abonnés)"); + + List bindings = query.getParameterBindings(); + + assertThat(bindings, hasSize(1)); + assertNamedBinding(InParameterBinding.class, "abonnés", bindings.get(0)); + } + + /** + * @see DATAJPA-545 + */ + @Test + public void detectsInBindingWithSpecialCharactersInParentheses() { + + StringQuery query = new StringQuery("select * from MyEntity where øre in (:øre)"); + + List bindings = query.getParameterBindings(); + + assertThat(bindings, hasSize(1)); + assertNamedBinding(InParameterBinding.class, "øre", bindings.get(0)); + } + + /** + * @see DATAJPA-545 + */ + @Test + public void detectsInBindingWithSpecialAsianCharactersInParentheses() { + + StringQuery query = new StringQuery("select * from MyEntity where 생일 in (:생일)"); + + List bindings = query.getParameterBindings(); + + assertThat(bindings, hasSize(1)); + assertNamedBinding(InParameterBinding.class, "생일", bindings.get(0)); + } + + /** + * @see DATAJPA-545 + */ + @Test + public void detectsInBindingWithSpecialCharactersAndWordCharactersMixedInParentheses() { + + StringQuery query = new StringQuery("select * from MyEntity where foo in (:ab1babc생일233)"); + + List bindings = query.getParameterBindings(); + + assertThat(bindings, hasSize(1)); + assertNamedBinding(InParameterBinding.class, "ab1babc생일233", bindings.get(0)); + } + private void assertPositionalBinding(Class bindingType, Integer position, ParameterBinding expectedBinding) {