Skip to content

Commit 7e2c9a7

Browse files
jewoodevmp911de
authored andcommitted
Allow REGEXP modifier in HQL LIKE predicates.
Hibernate's HQL parser accepts `LIKE REGEXP` and `ILIKE REGEXP` predicates. Align Spring Data JPA's HQL grammar with that syntax and cover the round-trip rendering path. Signed-off-by: jewoodev <jewoos15@naver.com> Closes #4295
1 parent a279085 commit 7e2c9a7

2 files changed

Lines changed: 11 additions & 1 deletion

File tree

  • spring-data-jpa/src

‎spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1487,7 +1487,7 @@ betweenExpression
14871487

14881488
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate
14891489
stringPatternMatching
1490-
: expression NOT? (LIKE | ILIKE) expression (ESCAPE (STRING_LITERAL | JAVA_STRING_LITERAL |parameter))?
1490+
: expression NOT? (LIKE | ILIKE) REGEXP? expression (ESCAPE (STRING_LITERAL | JAVA_STRING_LITERAL |parameter))?
14911491
;
14921492

14931493
// https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices
@@ -1707,6 +1707,7 @@ nakedIdentifier
17071707
| PRECEDING
17081708
| QUARTER
17091709
| RANGE
1710+
| REGEXP
17101711
| RESPECT
17111712
| RETURNING
17121713
| RIGHT
@@ -1968,6 +1969,7 @@ POSITION : P O S I T I O N;
19681969
PRECEDING : P R E C E D I N G;
19691970
QUARTER : Q U A R T E R;
19701971
RANGE : R A N G E;
1972+
REGEXP : R E G E X P;
19711973
RESPECT : R E S P E C T;
19721974
RETURNING : R E T U R N I N G;
19731975
RIGHT : R I G H T;

‎spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryRendererTests.java‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,14 @@ void position() {
373373
"from Call c ");
374374
}
375375

376+
@Test
377+
void likeRegexpPredicate() {
378+
379+
assertQuery("select p from Person p where p.name like regexp 'Jo.*'");
380+
assertQuery("select p from Person p where p.name not like regexp 'Jo.*'");
381+
assertQuery("select p from Person p where p.name ilike regexp 'jo.*'");
382+
}
383+
376384
@Test // GH-3689
377385
void currentDateFunctions() {
378386

0 commit comments

Comments
 (0)