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 4e2bb80f0..3825b10dd 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 @@ -110,7 +110,7 @@ public abstract class QueryUtils { builder.append(IDENTIFIER_GROUP); // Entity name, can be qualified (any builder.append("(?:\\sas)*"); // exclude possible "as" keyword builder.append("(?:\\s)+"); // at least one space separating - builder.append("(\\w*)"); // the actual alias + builder.append("(?!(?:where))(\\w*)"); // the actual alias ALIAS_MATCH = compile(builder.toString(), CASE_INSENSITIVE); @@ -199,8 +199,7 @@ public abstract class QueryUtils { * @return */ public static String applySorting(String query, Sort sort) { - - return applySorting(query, sort, DEFAULT_ALIAS); + return applySorting(query, sort, detectAlias(query)); } /** @@ -259,7 +258,8 @@ public abstract class QueryUtils { } } - String reference = qualifyReference ? String.format("%s.%s", alias, property) : property; + String reference = qualifyReference && StringUtils.hasText(alias) ? String.format("%s.%s", alias, property) + : property; String wrapped = order.isIgnoreCase() ? String.format("lower(%s)", reference) : reference; return String.format("%s %s", wrapped, toJpaDirection(order)); 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 939b6fcbe..30ca4f28a 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 @@ -352,6 +352,15 @@ public class QueryUtilsUnitTests { assertThat(hasConstructorExpression("select new foo.bar.FooBar(\na.id) from DtoA a "), is(true)); } + /** + * @see DATAJPA-960 + */ + @Test + public void doesNotQualifySortIfNoAliasDetected() { + assertThat(applySorting("from mytable where ?1 is null", new Sort("firstname")), + endsWith("order by firstname asc")); + } + private static void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery), is(countQuery)); }