DATAJPA-960 - Fixed alias detection for queries not containing an alias.

We're now more lenient against manually defined queries that do not contain aliases when adding order by clauses to them. The alias detection now doesn't accidentally pick up "where" anymore in case no primary alias is declared and the code applying the order by clause only qualifies the expressions created if there actually is an alias in the first place.
This commit is contained in:
Oliver Gierke
2016-09-04 18:47:22 +02:00
parent 32546f0a29
commit 9ce31b9da8
2 changed files with 13 additions and 4 deletions

View File

@@ -107,7 +107,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);
@@ -182,8 +182,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));
}
/**
@@ -242,7 +241,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));

View File

@@ -323,6 +323,15 @@ public class QueryUtilsUnitTests {
assertThat(applySorting(query, sort, "c"), endsWith("order by c.dPropertyStartingWithJoinAlias asc"));
}
/**
* @see DATAJPA-960
*/
@Test
public void doesNotQualifySortIfNoAliasDetected() {
assertThat(applySorting("from mytable where ?1 is null", new Sort("firstname")),
endsWith("order by firstname asc"));
}
private void assertCountQuery(String originalQuery, String countQuery) {
assertThat(createCountQueryFor(originalQuery), is(countQuery));
}