From f697b2e1020c34d4a8d39266869163c1649fb82c Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Thu, 25 Apr 2013 10:54:26 +0200 Subject: [PATCH] DATAJPA-296 - Fixed ignore case handling for Querydsl integration. When using QuerydslPredicateExecutor the ignore case flag defined on the given Order inside a Pageable is considered correctly. --- .../data/jpa/repository/support/Querydsl.java | 25 +++++++++++-------- .../support/QueryDslJpaRepositoryTests.java | 25 ++++++++++++++++--- 2 files changed, 37 insertions(+), 13 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 5c055d339..1186ba9fd 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 @@ -67,15 +67,15 @@ public class Querydsl { public JPQLQuery createQuery() { switch (provider) { - case ECLIPSELINK: - return new JPAQuery(em, EclipseLinkTemplates.DEFAULT); - case HIBERNATE: - return new JPAQuery(em, HQLTemplates.DEFAULT); - case OPEN_JPA: - return new JPAQuery(em, OpenJPATemplates.DEFAULT); - case GENERIC_JPA: - default: - return new JPAQuery(em); + case ECLIPSELINK: + return new JPAQuery(em, EclipseLinkTemplates.DEFAULT); + case HIBERNATE: + return new JPAQuery(em, HQLTemplates.DEFAULT); + case OPEN_JPA: + return new JPAQuery(em, OpenJPATemplates.DEFAULT); + case GENERIC_JPA: + default: + return new JPAQuery(em); } } @@ -136,7 +136,12 @@ public class Querydsl { @SuppressWarnings({ "rawtypes", "unchecked" }) private OrderSpecifier toOrder(Order order) { - Expression property = builder.get(order.getProperty()); + Expression property = builder.get(order.getProperty()); + + // Apply ignore case in case we have a String and ignore case ordering is requested + if (order.isIgnoreCase()) { + property = builder.getString(order.getProperty()).lower(); + } return new OrderSpecifier(order.isAscending() ? com.mysema.query.types.Order.ASC : com.mysema.query.types.Order.DESC, property); diff --git a/src/test/java/org/springframework/data/jpa/repository/support/QueryDslJpaRepositoryTests.java b/src/test/java/org/springframework/data/jpa/repository/support/QueryDslJpaRepositoryTests.java index f6476adb1..ae92839e8 100644 --- a/src/test/java/org/springframework/data/jpa/repository/support/QueryDslJpaRepositoryTests.java +++ b/src/test/java/org/springframework/data/jpa/repository/support/QueryDslJpaRepositoryTests.java @@ -28,7 +28,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; +import org.springframework.data.domain.Sort.Order; import org.springframework.data.jpa.domain.sample.QUser; import org.springframework.data.jpa.domain.sample.User; import org.springframework.test.context.ContextConfiguration; @@ -55,7 +57,7 @@ public class QueryDslJpaRepositoryTests { QueryDslJpaRepository repository; QUser user = new QUser("user"); - User dave, carter; + User dave, carter, oliver; @Before public void setUp() { @@ -66,6 +68,7 @@ public class QueryDslJpaRepositoryTests { repository = new QueryDslJpaRepository(information, em); dave = repository.save(new User("Dave", "Matthews", "dave@matthews.com")); carter = repository.save(new User("Carter", "Beauford", "carter@beauford.com")); + oliver = repository.save(new User("Oliver", "matthews", "oliver@matthews.com")); } @Test @@ -107,9 +110,25 @@ public class QueryDslJpaRepositoryTests { assertThat(result.getContent(), hasSize(1)); assertThat(result.getContent().get(0), is(carter)); - result = repository.findAll(lastnameContainsE, new PageRequest(0, 1, Direction.DESC, "lastname")); + result = repository.findAll(lastnameContainsE, new PageRequest(0, 2, Direction.DESC, "lastname")); - assertThat(result.getContent(), hasSize(1)); + assertThat(result.getContent(), hasSize(2)); + assertThat(result.getContent().get(0), is(oliver)); + assertThat(result.getContent().get(1), is(dave)); + } + + /** + * @see DATAJPA-296 + */ + @Test + public void appliesIgnoreCaseOrdering() { + + Sort sort = new Sort(new Order(Direction.DESC, "lastname").ignoreCase(), new Order(Direction.ASC, "firstname")); + + Page result = repository.findAll(user.lastname.contains("e"), new PageRequest(0, 2, sort)); + + assertThat(result.getContent(), hasSize(2)); assertThat(result.getContent().get(0), is(dave)); + assertThat(result.getContent().get(1), is(oliver)); } }