From 0b9e711315683b2b49a579a17813eb9e1b05daa4 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 37aca64bf..a4d7a9372 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 @@ -79,6 +79,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; @@ -186,7 +187,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 158933555..7166f28e1 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 @@ -244,6 +244,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)); }