From 1f28c612477a7e67919208efd10ebe0cab648ef7 Mon Sep 17 00:00:00 2001 From: "Greg L. Turnquist" Date: Wed, 17 May 2023 15:47:19 -0500 Subject: [PATCH] Resolve handling of ESCAPE clause with LIKE queries on EclipseLink. Migrate tests to H2 to verify LIKE with ESCAPE works properly on EclipseLink with Spring Data JPA. Resolves #2955 Original Pull Request: #2956. --- pom.xml | 1 + spring-data-jpa/pom.xml | 7 ++++ .../data/jpa/repository/query/Hql.g4 | 2 +- .../repository/query/HqlQueryRenderer.java | 6 +++- .../EclipseLinkUserRepositoryFinderTests.java | 20 ++--------- .../repository/UserRepositoryFinderTests.java | 3 +- .../namespace-application-context-h2.xml | 31 ++++++++++++++++ .../src/test/resources/eclipselink-h2.xml | 21 +++++++++++ .../src/test/resources/infrastructure-h2.xml | 35 +++++++++++++++++++ .../src/test/resources/scripts/h2-init.sql | 1 + .../scripts/h2-stored-procedures.sql | 9 +++++ 11 files changed, 115 insertions(+), 21 deletions(-) create mode 100644 spring-data-jpa/src/test/resources/config/namespace-application-context-h2.xml create mode 100644 spring-data-jpa/src/test/resources/eclipselink-h2.xml create mode 100644 spring-data-jpa/src/test/resources/infrastructure-h2.xml create mode 100644 spring-data-jpa/src/test/resources/scripts/h2-init.sql create mode 100644 spring-data-jpa/src/test/resources/scripts/h2-stored-procedures.sql diff --git a/pom.xml b/pom.xml index b7f501997..3ebc82d28 100644 --- a/pom.xml +++ b/pom.xml @@ -31,6 +31,7 @@ 3.0.3 6.2.1.Final 2.7.1 +

2.1.214

4.5 8.0.31 42.5.0 diff --git a/spring-data-jpa/pom.xml b/spring-data-jpa/pom.xml index f4560082c..4f2c403f7 100644 --- a/spring-data-jpa/pom.xml +++ b/spring-data-jpa/pom.xml @@ -100,6 +100,13 @@ test + + com.h2database + h2 + ${h2} + test + + com.mysql diff --git a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 index 731bb16c7..b702bad0c 100644 --- a/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 +++ b/spring-data-jpa/src/main/antlr4/org/springframework/data/jpa/repository/query/Hql.g4 @@ -579,7 +579,7 @@ dealingWithNullExpression // https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-like-predicate stringPatternMatching - : expression NOT? (LIKE | ILIKE) expression (ESCAPE expression)? + : expression NOT? (LIKE | ILIKE) expression (ESCAPE (character|parameter))? ; // https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#hql-elements-indices diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java index 5446173ca..17458b20e 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/HqlQueryRenderer.java @@ -2124,7 +2124,11 @@ class HqlQueryRenderer extends HqlBaseVisitor> { if (ctx.ESCAPE() != null) { tokens.add(new JpaQueryParsingToken(ctx.ESCAPE())); - tokens.addAll(visit(ctx.expression(2))); + if (ctx.character() != null) { + tokens.addAll(visit(ctx.character())); + } else if (ctx.parameter() != null) { + tokens.addAll(visit(ctx.parameter())); + } } return tokens; diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EclipseLinkUserRepositoryFinderTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EclipseLinkUserRepositoryFinderTests.java index 1b6bc2a7b..473331252 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EclipseLinkUserRepositoryFinderTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/EclipseLinkUserRepositoryFinderTests.java @@ -23,8 +23,9 @@ import org.springframework.test.context.ContextConfiguration; * https://bugs.eclipse.org/bugs/show_bug.cgi?id=349477. * * @author Oliver Gierke + * @author Greg Turnquist */ -@ContextConfiguration("classpath:eclipselink.xml") +@ContextConfiguration("classpath:eclipselink-h2.xml") class EclipseLinkUserRepositoryFinderTests extends UserRepositoryFinderTests { @Disabled @@ -35,21 +36,4 @@ class EclipseLinkUserRepositoryFinderTests extends UserRepositoryFinderTests { @Override void executesInKeywordForPageCorrectly() {} - @Disabled("Can't get ESCAPE clause working with EclipseLink. See #2955") - @Override - void escapingInLikeSpels() { - super.escapingInLikeSpels(); - } - - @Disabled("Can't get ESCAPE clause working with EclipseLink. See #2955") - @Override - void escapingInLikeSpelsInThePresenceOfEscapeCharacters() { - super.escapingInLikeSpelsInThePresenceOfEscapeCharacters(); - } - - @Disabled("Can't get ESCAPE clause working with EclipseLink. See #2955") - @Override - void escapingInLikeSpelsInThePresenceOfEscapedWildcards() { - super.escapingInLikeSpelsInThePresenceOfEscapedWildcards(); - } } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java index bccc417ea..4b6c4bb9e 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/UserRepositoryFinderTests.java @@ -52,10 +52,11 @@ import org.springframework.transaction.annotation.Transactional; * * @author Oliver Gierke * @author Krzysztof Krason + * @author Greg Turnquist * @see QueryLookupStrategy */ @ExtendWith(SpringExtension.class) -@ContextConfiguration(locations = "classpath:config/namespace-application-context.xml") +@ContextConfiguration(locations = "classpath:config/namespace-application-context-h2.xml") @Transactional class UserRepositoryFinderTests { diff --git a/spring-data-jpa/src/test/resources/config/namespace-application-context-h2.xml b/spring-data-jpa/src/test/resources/config/namespace-application-context-h2.xml new file mode 100644 index 000000000..9cb3eab27 --- /dev/null +++ b/spring-data-jpa/src/test/resources/config/namespace-application-context-h2.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + diff --git a/spring-data-jpa/src/test/resources/eclipselink-h2.xml b/spring-data-jpa/src/test/resources/eclipselink-h2.xml new file mode 100644 index 000000000..71d4ab637 --- /dev/null +++ b/spring-data-jpa/src/test/resources/eclipselink-h2.xml @@ -0,0 +1,21 @@ + + + + + + + + org.h2.Driver + jdbc:h2:mem:hades + sa + + create-tables + false + SEVERE + + + diff --git a/spring-data-jpa/src/test/resources/infrastructure-h2.xml b/spring-data-jpa/src/test/resources/infrastructure-h2.xml new file mode 100644 index 000000000..723454c01 --- /dev/null +++ b/spring-data-jpa/src/test/resources/infrastructure-h2.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-data-jpa/src/test/resources/scripts/h2-init.sql b/spring-data-jpa/src/test/resources/scripts/h2-init.sql new file mode 100644 index 000000000..1c8a0e797 --- /dev/null +++ b/spring-data-jpa/src/test/resources/scripts/h2-init.sql @@ -0,0 +1 @@ +; \ No newline at end of file diff --git a/spring-data-jpa/src/test/resources/scripts/h2-stored-procedures.sql b/spring-data-jpa/src/test/resources/scripts/h2-stored-procedures.sql new file mode 100644 index 000000000..1023dc1a3 --- /dev/null +++ b/spring-data-jpa/src/test/resources/scripts/h2-stored-procedures.sql @@ -0,0 +1,9 @@ +/; +DROP alias IF EXISTS plus1inout +/; +CREATE alias plus1inout AS $$ +Integer plus1inout(Integer arg) { + return arg + 1; +} +$$ +/;