diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java index 1d68ab43a..1bded1961 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java +++ b/spring-data-jpa/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 abstract class QueryUtils { 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/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java index d7aaad168..6082e4163 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/QueryUtilsUnitTests.java @@ -421,6 +421,11 @@ class QueryUtilsUnitTests { " 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 @@ class QueryUtilsUnitTests { 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); }