From 0549dcd790f23b0fc6555d42e6bc8256a09fb0a4 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Tue, 13 Aug 2013 13:06:48 +0200 Subject: [PATCH] DATAJPA-375 - Fixed application of sort to queries with existing order by. Improved existingin order by detection to detect the existing clause independent of the case. Before we only detected lower case "order by" expressions. --- .../data/jpa/repository/query/QueryUtils.java | 3 ++- .../jpa/repository/query/QueryUtilsUnitTests.java | 11 +++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) 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 35a356f03..00ed14404 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 @@ -77,6 +77,7 @@ public abstract class QueryUtils { private static final Pattern LEFT_JOIN_PATTERN = Pattern.compile(LEFT_JOIN, Pattern.CASE_INSENSITIVE); private static final String EQUALS_CONDITION_STRING = "%s.%s = :%s"; + private static final Pattern ORDER_BY = Pattern.compile(".*order\\s+by\\s+.*", CASE_INSENSITIVE); private static final Set ASSOCIATION_TYPES; @@ -184,7 +185,7 @@ public abstract class QueryUtils { StringBuilder builder = new StringBuilder(query); - if (!query.contains("order by")) { + if (!ORDER_BY.matcher(query).matches()) { builder.append(" order by "); } else { builder.append(", "); 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 66f8b02cd..0293a620d 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 @@ -220,6 +220,17 @@ public class QueryUtilsUnitTests { "select count(distinct m.genre) from Media m where m.user = ?1"); } + /** + * @see DATAJPA-375 + */ + @Test + public void findsExistingOrderByIndependentOfCase() { + + Sort sort = new Sort("lastname"); + String query = applySorting("select p from Person p ORDER BY p.firstname", sort, "p"); + assertThat(query, endsWith("ORDER BY p.firstname, p.lastname asc")); + } + private void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery), is(countQuery)); }