diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryTransformerSupport.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryTransformerSupport.java index bce349e87..b791c4771 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryTransformerSupport.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryTransformerSupport.java @@ -131,13 +131,18 @@ class JpaQueryTransformerSupport { return false; } + // If the Sort starts with the primary alias + if (order.getProperty().startsWith(primaryFromAlias + ".")) { + return false; + } + // If the Sort references an alias directly if (projectionAliases.contains(order.getProperty())) { return false; } // If the Sort property starts with an alias - if (projectionAliases.stream().anyMatch(alias -> order.getProperty().startsWith(alias))) { + if (projectionAliases.stream().anyMatch(alias -> order.getProperty().startsWith(alias + "."))) { return false; } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java index 460d8f456..a5d1cd7c3 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/query/HqlQueryTransformerTests.java @@ -1006,6 +1006,31 @@ class HqlQueryTransformerTests { """); } + @Test // GH-3054 + void aliasesShouldNotOverlapWithSortProperties() { + + assertThat( + createQueryFor("select e from Employee e where e.name = :name", Sort.by(Sort.Order.desc("evaluationDate")))) + .isEqualToIgnoringWhitespace( + "select e from Employee e where e.name = :name order by e.evaluationDate desc"); + + assertThat(createQueryFor("select e from Employee e join training t where e.name = :name", + Sort.by(Sort.Order.desc("trainingDueDate")))).isEqualToIgnoringWhitespace( + "select e from Employee e join training t where e.name = :name order by e.trainingDueDate desc"); + + assertThat(createQueryFor("select e from Employee e join training t where e.name = :name", + Sort.by(Sort.Order.desc("t.trainingDueDate")))).isEqualToIgnoringWhitespace( + "select e from Employee e join training t where e.name = :name order by t.trainingDueDate desc"); + + assertThat(createQueryFor("SELECT t3 FROM Test3 t3 JOIN t3.test2 t2 JOIN t2.test1 test WHERE test.id = :test1Id", + Sort.by(Sort.Order.desc("testDuplicateColumnName")))).isEqualToIgnoringWhitespace( + "SELECT t3 FROM Test3 t3 JOIN t3.test2 t2 JOIN t2.test1 test WHERE test.id = :test1Id order by t3.testDuplicateColumnName desc"); + + assertThat(createQueryFor("SELECT t3 FROM Test3 t3 JOIN t3.test2 x WHERE x.id = :test2Id", + Sort.by(Sort.Order.desc("t3.testDuplicateColumnName")))).isEqualToIgnoringWhitespace( + "SELECT t3 FROM Test3 t3 JOIN t3.test2 x WHERE x.id = :test2Id order by t3.testDuplicateColumnName desc"); + } + private void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery)).isEqualTo(countQuery); }