Skip to content

Commit 3ae3779

Browse files
committed
DATAJPA-1652: Using || (pipes) along with named parameters in custom queries raises an exception
1 parent 9d5c13e commit 3ae3779

File tree

2 files changed

+32
-4
lines changed

2 files changed

+32
-4
lines changed

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,8 +89,8 @@ public abstract class QueryUtils {
8989
// Z Separator
9090
// Cc Control
9191
// Cf Format
92-
// P Punctuation
93-
private static final String IDENTIFIER = "[._[\\P{Z}&&\\P{Cc}&&\\P{Cf}&&\\P{P}]]+";
92+
// Punct Punctuation
93+
private static final String IDENTIFIER = "[._$#[\\P{Z}&&\\P{Cc}&&\\P{Cf}&&\\P{Punct}]]+";
9494
static final String COLON_NO_DOUBLE_COLON = "(?<![:\\\\]):";
9595
static final String IDENTIFIER_GROUP = String.format("(%s)", IDENTIFIER);
9696

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

+30-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
* you may not use this file except in compliance with the License.
66
* You may obtain a copy of the License at
77
*
8-
* https://www.apache.org/licenses/LICENSE-2.0
8+
* https://www.apache.org/licenses/LICENSE-2.0
99
*
1010
* Unless required by applicable law or agreed to in writing, software
1111
* distributed under the License is distributed on an "AS IS" BASIS,
@@ -319,7 +319,7 @@ public void detectsConstructorExpressions() {
319319

320320
/**
321321
* @see <a href="download.oracle.com/otn-pub/jcp/persistence-2_1-fr-eval-spec/JavaPersistence.pdf">JPA 2.1
322-
* specification, section 4.8</a>
322+
* specification, section 4.8</a>
323323
*/
324324
@Test // DATAJPA-886
325325
public void detectsConstructorExpressionForDefaultConstructor() {
@@ -540,6 +540,34 @@ public void isNotDefaultProjection() {
540540
softly.assertAll();
541541
}
542542

543+
@Test // DATAJPA-1652
544+
public void usingPipesWithNamedParameter() {
545+
546+
String queryString = "SELECT u FROM User u WHERE u.lastname LIKE '%'||:name||'%'";
547+
StringQuery query = new StringQuery(queryString);
548+
549+
softly.assertThat(query.getQueryString()).isEqualTo(queryString);
550+
softly.assertThat(query.hasParameterBindings()).isTrue();
551+
softly.assertThat(query.getParameterBindings()).hasSize(1);
552+
softly.assertThat(query.getParameterBindings().get(0).getName()).isEqualTo("name");
553+
554+
softly.assertAll();
555+
}
556+
557+
@Test // DATAJPA-1652
558+
public void usingGreaterThanWithNamedParameter() {
559+
560+
String queryString = "SELECT u FROM User u WHERE :age<u.age";
561+
StringQuery query = new StringQuery(queryString);
562+
563+
softly.assertThat(query.getQueryString()).isEqualTo(queryString);
564+
softly.assertThat(query.hasParameterBindings()).isTrue();
565+
softly.assertThat(query.getParameterBindings()).hasSize(1);
566+
softly.assertThat(query.getParameterBindings().get(0).getName()).isEqualTo("age");
567+
568+
softly.assertAll();
569+
}
570+
543571
public void checkNumberOfNamedParameters(String query, int expectedSize, String label) {
544572

545573
DeclaredQuery declaredQuery = DeclaredQuery.of(query);

0 commit comments

Comments
 (0)