From 8a9294ac0399e968f2db4300f4dec3da876ab7df Mon Sep 17 00:00:00 2001 From: Darin Manica Date: Fri, 22 Jul 2022 10:36:04 -0600 Subject: [PATCH] Fix alias detection in multi-line queries See #2563 --- .../data/jpa/repository/query/QueryUtils.java | 11 ++++++++++- .../jpa/repository/query/QueryUtilsUnitTests.java | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java index e9ad5db78a..813599d40c 100644 --- a/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java +++ b/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java @@ -108,6 +108,7 @@ public abstract class QueryUtils { Pattern.CASE_INSENSITIVE); private static final Pattern NO_DIGITS = Pattern.compile("\\D+"); + private static final Pattern LINE_BREAK = Pattern.compile("\\R+"); private static final String JOIN = "join\\s+(fetch\\s+)?" + IDENTIFIER + "\\s+(as\\s+)?" + IDENTIFIER_GROUP; private static final Pattern JOIN_PATTERN = Pattern.compile(JOIN, Pattern.CASE_INSENSITIVE); @@ -436,7 +437,7 @@ private static String toJpaDirection(Order order) { public static String detectAlias(String query) { String alias = null; - Matcher matcher = ALIAS_MATCH.matcher(removeSubqueries(query)); + Matcher matcher = ALIAS_MATCH.matcher(removeSubqueries(removeLinebreaks(query))); while (matcher.find()) { alias = matcher.group(2); } @@ -491,6 +492,14 @@ static String removeSubqueries(String query) { return sb.toString(); } + static String removeLinebreaks(String query) { + if (!StringUtils.hasText(query)) { + return query; + } + + return LINE_BREAK.matcher(query).replaceAll(" "); + } + private static Integer findClose(final Integer open, final List closes, final List closeMatches) { for (int i = 0; i < closes.size(); i++) { diff --git a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java index 5b65b647f0..3b32ffc266 100644 --- a/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java @@ -140,6 +140,9 @@ void detectsAliasCorrectly() { assertThat( detectAlias("from User u where (cast(:e1f2f3ectiveFrom as date) is null) OR :effectiveFrom >= u.createdAt")) .isEqualTo("u"); + assertThat(detectAlias( + "SELECT o\nFROM Order o\nAND EXISTS(SELECT 1\nFROM Vehicle vehicle\nWHERE vehicle.vehicleOrderId = o.id\nAND LOWER(COALESCE(vehicle.make, '')) LIKE :query)")) + .isEqualTo("o"); // GH-2563 } @Test // GH-2260