From 4d63856dde267f12687c7940adabb4833efba12c Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Mon, 7 Apr 2014 14:42:51 +0200 Subject: [PATCH] DATAJPA-510 - Fix regression when sorting by property of associated object. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The main problem was a bug in querydsl 3.3.2 that has been resolved resolved in querydsl 3.3.3 to which we just updated in in spring-data-build/#70. Cleaner usage of querydsl API and less brittle casting. Added test case for sorting by nested association property that is wrapped in a function, e.g. lower(…). Original pull request: #87. --- .../data/jpa/repository/support/Querydsl.java | 6 ++++-- .../jpa/repository/UserRepositoryTests.java | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java b/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java index aef50817b..44883ae03 100644 --- a/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java +++ b/src/main/java/org/springframework/data/jpa/repository/support/Querydsl.java @@ -31,10 +31,12 @@ import com.mysema.query.jpa.HQLTemplates; import com.mysema.query.jpa.JPQLQuery; import com.mysema.query.jpa.OpenJPATemplates; import com.mysema.query.jpa.impl.JPAQuery; +import com.mysema.query.support.Expressions; import com.mysema.query.types.EntityPath; import com.mysema.query.types.Expression; import com.mysema.query.types.OrderSpecifier; import com.mysema.query.types.OrderSpecifier.NullHandling; +import com.mysema.query.types.Path; import com.mysema.query.types.path.PathBuilder; /** @@ -224,9 +226,9 @@ public class Querydsl { if (!path.hasNext() && order.isIgnoreCase()) { // if order is ignore-case we have to treat the last path segment as a String. - sortPropertyExpression = ((PathBuilder) sortPropertyExpression).getString(path.getSegment()).lower(); + sortPropertyExpression = Expressions.stringPath((Path) sortPropertyExpression, path.getSegment()).lower(); } else { - sortPropertyExpression = ((PathBuilder) sortPropertyExpression).get(path.getSegment()); + sortPropertyExpression = Expressions.path(path.getType(), (Path) sortPropertyExpression, path.getSegment()); } path = path.next(); diff --git a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java index 0cdacb131..d4b84de3e 100644 --- a/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/UserRepositoryTests.java @@ -1281,6 +1281,24 @@ public class UserRepositoryTests { assertThat(page.getContent().get(3), is(firstUser)); } + /** + * @see DATAJPA-510 + */ + @Test + public void sortByNestedAssociationPropertyWithSortOrderIgnoreCaseInPageable() { + + firstUser.setManager(thirdUser); + thirdUser.setManager(fourthUser); + + flushTestUsers(); + + Page page = repository.findAll(new PageRequest(0, 10, // + new Sort(new Sort.Order(Direction.ASC, "manager.manager.firstname").ignoreCase()))); + + assertThat(page.getContent(), hasSize(4)); + assertThat(page.getContent().get(3), is(firstUser)); + } + /** * @see DATAJPA-496 */