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 b7638cdee..aef50817b 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 @@ -170,14 +170,41 @@ public class Querydsl { /** * Transforms a plain {@link Order} into a QueryDsl specific {@link OrderSpecifier}. * - * @param order + * @param order must not be {@literal null}. * @return */ @SuppressWarnings({ "rawtypes", "unchecked" }) private OrderSpecifier toOrderSpecifier(Order order, JPQLQuery query) { return new OrderSpecifier(order.isAscending() ? com.mysema.query.types.Order.ASC - : com.mysema.query.types.Order.DESC, buildOrderPropertyPathFrom(order), NullHandling.NullsLast); + : com.mysema.query.types.Order.DESC, buildOrderPropertyPathFrom(order), + toQueryDslNullHandling(order.getNullHandling())); + } + + /** + * Converts the given {@link org.springframework.data.domain.Sort.NullHandling} to the appropriate Querydsl + * {@link NullHandling}. + * + * @param nullHandling must not be {@literal null}. + * @return + * @since 1.6 + */ + private NullHandling toQueryDslNullHandling(org.springframework.data.domain.Sort.NullHandling nullHandling) { + + Assert.notNull(nullHandling, "NullHandling must not be null!"); + + switch (nullHandling) { + + case NULLS_FIRST: + return NullHandling.NullsFirst; + + case NULLS_LAST: + return NullHandling.NullsLast; + + case NATIVE: + default: + return NullHandling.Default; + } } /** diff --git a/src/test/java/org/springframework/data/jpa/repository/support/QuerydslIntegrationTests.java b/src/test/java/org/springframework/data/jpa/repository/support/QuerydslIntegrationTests.java new file mode 100644 index 000000000..e3f0d12ea --- /dev/null +++ b/src/test/java/org/springframework/data/jpa/repository/support/QuerydslIntegrationTests.java @@ -0,0 +1,71 @@ +/* + * Copyright 2014 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.springframework.data.jpa.repository.support; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.domain.sample.User; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.transaction.annotation.Transactional; + +import com.mysema.query.jpa.JPQLQuery; +import com.mysema.query.types.path.PathBuilder; + +/** + * Integration tests for {@link Querydsl}. + * + * @author Thomas Darimont + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration({ "classpath:infrastructure.xml" }) +@Transactional +public class QuerydslIntegrationTests { + + @PersistenceContext EntityManager em; + + Querydsl querydsl; + PathBuilder userPath; + JPQLQuery userQuery; + + @Before + public void setup() { + + userPath = new PathBuilder(User.class, "user"); + querydsl = new Querydsl(em, userPath); + userQuery = querydsl.createQuery().from(userPath); + } + + /** + * @see DATAJPA-499 + */ + @Test + public void defaultOrderingShouldNotGenerateAnNullOrderingHint() { + + JPQLQuery result = querydsl.applySorting(new Sort(new Sort.Order("firstname")), userQuery); + + assertThat(result, is(notNullValue())); + assertThat(result.toString(), is(not(anyOf(containsString("nulls first"), containsString("nulls last"))))); + } +}