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 22ed2732a..a2f79a4f0 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 @@ -157,11 +157,13 @@ class StringQuery { builder.append(StringUtils.collectionToDelimitedString(keywords, "|")); // keywords builder.append(")?"); builder.append("(?: )?"); // some whitespace + builder.append("\\(?"); // optional braces around paramters builder.append("("); builder.append("%?(\\?(\\d+))%?"); // position parameter builder.append("|"); // or builder.append("%?(:(\\w+))%?"); // named parameter; builder.append(")"); + builder.append("\\)?"); // optional braces around paramters PARAMETER_BINDING_PATTERN = Pattern.compile(builder.toString(), CASE_INSENSITIVE); } 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 0807e5724..dc26efd11 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 @@ -212,6 +212,20 @@ public class StringQueryUnitTests { + " OR a.content LIKE :escapedWord ESCAPE '~' OR a.title = :word ORDER BY a.articleId DESC")); } + /** + * @see DATAJPA-483 + */ + @Test + public void detectsInBindingWithParentheses() { + + StringQuery query = new StringQuery("select count(we) from MyEntity we where we.status in (:statuses)"); + + List bindings = query.getParameterBindings(); + + assertThat(bindings, hasSize(1)); + assertNamedBinding(InParameterBinding.class, "statuses", bindings.get(0)); + } + private void assertPositionalBinding(Class bindingType, Integer position, ParameterBinding expectedBinding) {