From 4c65ad1df6ea281036b5d35c25473a57f0bc3ac0 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 18 Apr 2013 11:20:14 +0200 Subject: [PATCH] DATAJPA-296 - Fixed application of ignore case flag on string queries. The ignore-case flag held in a Sort.Order is now also applied when manually defining queries. --- .../data/jpa/repository/query/QueryUtils.java | 7 ++++-- .../repository/query/QueryUtilsUnitTests.java | 24 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) 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 8ab3a99ac..3a173b5a2 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 @@ -190,7 +190,7 @@ public abstract class QueryUtils { Set aliases = getOuterJoinAliases(query); for (Order order : sort) { - builder.append(getOrderClause(aliases, alias, order)); + builder.append(getOrderClause(aliases, alias, order)).append(", "); } builder.delete(builder.length() - 2, builder.length()); @@ -219,7 +219,10 @@ public abstract class QueryUtils { } } - return String.format("%s%s %s, ", qualifyReference ? alias + "." : "", property, toJpaDirection(order)); + String reference = qualifyReference ? 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 2c144ca09..ce627f308 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 @@ -179,6 +179,30 @@ public class QueryUtilsUnitTests { assertThat(applySorting(query, new Sort("firstname"), "p"), endsWith("order by p.lastname asc, p.firstname asc")); } + /** + * @see DATAJPA-296 + */ + @Test + public void appliesIgnoreCaseOrderingCorrectly() { + + Sort sort = new Sort(new Sort.Order("firstname").ignoreCase()); + + String query = "select p from Person p"; + assertThat(applySorting(query, sort, "p"), endsWith("order by lower(p.firstname) asc")); + } + + /** + * @see DATAJPA-296 + */ + @Test + public void appendsIgnoreCaseOrderingCorrectly() { + + Sort sort = new Sort(new Sort.Order("firstname").ignoreCase()); + + String query = "select p from Person p order by p.lastname asc"; + assertThat(applySorting(query, sort, "p"), endsWith("order by p.lastname asc, lower(p.firstname) asc")); + } + private void assertCountQuery(String originalQuery, String countQuery) { assertThat(createCountQueryFor(originalQuery), is(countQuery)); }