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 ec9a05b209..6371624169 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 @@ -148,7 +148,7 @@ public abstract class QueryUtils { builder.append(IDENTIFIER_GROUP); builder.append("(.*)"); - COUNT_MATCH = compile(builder.toString(), CASE_INSENSITIVE); + COUNT_MATCH = compile(builder.toString(), CASE_INSENSITIVE | DOTALL); Map> persistentAttributeTypes = new HashMap<>(); persistentAttributeTypes.put(ONE_TO_ONE, OneToOne.class); @@ -490,7 +490,8 @@ public static String createCountQueryFor(String originalQuery, @Nullable String boolean useVariable = StringUtils.hasText(variable) // && !variable.startsWith(" new") // && !variable.startsWith("count(") // - && !variable.contains(","); // + && !variable.contains(",") // + && !variable.contains("*"); String complexCountValue = matcher.matches() && StringUtils.hasText(matcher.group(COMPLEX_COUNT_FIRST_INDEX)) ? COMPLEX_COUNT_VALUE 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 d7aaad1686..6082e4163c 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 @@ -421,6 +421,11 @@ void createCountQuerySupportsWhitespaceCharacters() { " where user.age = 18\n "); } + @Test // GH-2341 + void createCountQueryStarCharacterConverted() { + assertThat(createCountQueryFor("select * from User user")).isEqualTo("select count(user) from User user"); + } + @Test void createCountQuerySupportsLineBreaksInSelectClause() { @@ -522,6 +527,28 @@ void findProjectionClauseWithIncludedFrom() { assertThat(QueryUtils.getProjection("select x, frommage, y from t")).isEqualTo("x, frommage, y"); } + @Test // GH-2341 + void countProjectionDistrinctQueryIncludesNewLineAfterFromAndBeforeJoin() { + String originalQuery = "SELECT DISTINCT entity1\nFROM Entity1 entity1\nLEFT JOIN Entity2 entity2 ON entity1.key = entity2.key"; + + assertCountQuery(originalQuery, + "select count(DISTINCT entity1) FROM Entity1 entity1\nLEFT JOIN Entity2 entity2 ON entity1.key = entity2.key"); + } + + @Test // GH-2341 + void countProjectionDistinctQueryIncludesNewLineAfterEntity() { + String originalQuery = "SELECT DISTINCT entity1\nFROM Entity1 entity1 LEFT JOIN Entity2 entity2 ON entity1.key = entity2.key"; + assertCountQuery(originalQuery, + "select count(DISTINCT entity1) FROM Entity1 entity1 LEFT JOIN Entity2 entity2 ON entity1.key = entity2.key"); + } + + @Test // GH-2341 + void countProjectionDistinctQueryIncludesNewLineAfterEntityAndBeforeWhere() { + String originalQuery = "SELECT DISTINCT entity1\nFROM Entity1 entity1 LEFT JOIN Entity2 entity2 ON entity1.key = entity2.key\nwhere entity1.id = 1799"; + assertCountQuery(originalQuery, + "select count(DISTINCT entity1) FROM Entity1 entity1 LEFT JOIN Entity2 entity2 ON entity1.key = entity2.key\nwhere entity1.id = 1799"); + } + private static void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery); }