diff --git a/pom.xml b/pom.xml
index 75745189ed..fc8c866013 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
pom
Spring Data MongoDB
diff --git a/spring-data-mongodb-cross-store/pom.xml b/spring-data-mongodb-cross-store/pom.xml
index 40e8a0f253..7ec7a9cd4e 100644
--- a/spring-data-mongodb-cross-store/pom.xml
+++ b/spring-data-mongodb-cross-store/pom.xml
@@ -6,7 +6,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
../pom.xml
@@ -48,7 +48,7 @@
org.springframework.data
spring-data-mongodb
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
diff --git a/spring-data-mongodb-distribution/pom.xml b/spring-data-mongodb-distribution/pom.xml
index 13110137b6..2e05080c5f 100644
--- a/spring-data-mongodb-distribution/pom.xml
+++ b/spring-data-mongodb-distribution/pom.xml
@@ -13,7 +13,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb-log4j/pom.xml b/spring-data-mongodb-log4j/pom.xml
index 6ff09e4577..fa260b532d 100644
--- a/spring-data-mongodb-log4j/pom.xml
+++ b/spring-data-mongodb-log4j/pom.xml
@@ -5,7 +5,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/pom.xml b/spring-data-mongodb/pom.xml
index 568d347c4d..3a83791a2a 100644
--- a/spring-data-mongodb/pom.xml
+++ b/spring-data-mongodb/pom.xml
@@ -11,7 +11,7 @@
org.springframework.data
spring-data-mongodb-parent
- 1.7.0.BUILD-SNAPSHOT
+ 1.7.0.DATAMONGO-1085-SNAPSHOT
../pom.xml
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
index d3f43b43be..4859f614dd 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/core/MongoTemplate.java
@@ -1969,11 +1969,16 @@ private static final MongoConverter getDefaultMongoConverter(MongoDbFactory fact
private DBObject getMappedSortObject(Query query, Class> type) {
- if (query == null || query.getSortObject() == null) {
+ if (query == null) {
+ return null;
+ }
+
+ DBObject sortObject = query.getSortObject();
+ if (sortObject == null) {
return null;
}
- return queryMapper.getMappedSort(query.getSortObject(), mappingContext.getPersistentEntity(type));
+ return queryMapper.getMappedSort(sortObject, mappingContext.getPersistentEntity(type));
}
// Callback implementations
diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java
index 35cf425eb8..fc79a79ffe 100644
--- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java
+++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/support/QueryDslMongoRepository.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2011-2012 the original author or authors.
+ * Copyright 2011-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.
@@ -27,6 +27,7 @@
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.repository.query.MongoEntityInformation;
import org.springframework.data.querydsl.EntityPathResolver;
+import org.springframework.data.querydsl.QSort;
import org.springframework.data.querydsl.QueryDslPredicateExecutor;
import org.springframework.data.querydsl.SimpleEntityPathResolver;
import org.springframework.data.repository.core.EntityInformation;
@@ -44,6 +45,7 @@
* Special QueryDsl based repository implementation that allows execution {@link Predicate}s in various forms.
*
* @author Oliver Gierke
+ * @author Thomas Darimont
*/
public class QueryDslMongoRepository extends SimpleMongoRepository implements
QueryDslPredicateExecutor {
@@ -105,7 +107,6 @@ public List findAll(Predicate predicate) {
* @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(com.mysema.query.types.Predicate, com.mysema.query.types.OrderSpecifier>[])
*/
public List findAll(Predicate predicate, OrderSpecifier>... orders) {
-
return createQueryFor(predicate).orderBy(orders).list();
}
@@ -115,7 +116,7 @@ public List findAll(Predicate predicate, OrderSpecifier>... orders) {
*/
@Override
public Iterable findAll(OrderSpecifier>... orders) {
- return createQueryFor(new Predicate[0]).orderBy(orders).list();
+ return createQuery().orderBy(orders).list();
}
/*
@@ -130,6 +131,25 @@ public Page findAll(Predicate predicate, Pageable pageable) {
return new PageImpl(applyPagination(query, pageable).list(), pageable, countQuery.count());
}
+ /*
+ * (non-Javadoc)
+ * @see org.springframework.data.querydsl.QueryDslPredicateExecutor#findAll(org.springframework.data.domain.Pageable)
+ */
+ public Page findAll(Pageable pageable) {
+
+ MongodbQuery countQuery = createQuery();
+ MongodbQuery query = createQuery();
+
+ return new PageImpl(applyPagination(query, pageable).list(), pageable, countQuery.count());
+ }
+
+ /* (non-Javadoc)
+ * @see org.springframework.data.mongodb.repository.support.SimpleMongoRepository#findAll(org.springframework.data.domain.Sort)
+ */
+ public List findAll(Sort sort) {
+ return applySorting(createQuery(), sort).list();
+ }
+
/*
* (non-Javadoc)
* @see org.springframework.data.querydsl.QueryDslPredicateExecutor#count(com.mysema.query.types.Predicate)
@@ -144,12 +164,17 @@ public long count(Predicate predicate) {
* @param predicate
* @return
*/
- private MongodbQuery createQueryFor(Predicate... predicate) {
-
- Class domainType = entityInformation.getJavaType();
+ private MongodbQuery createQueryFor(Predicate predicate) {
+ return createQuery().where(predicate);
+ }
- MongodbQuery query = new SpringDataMongodbQuery(mongoOperations, domainType);
- return query.where(predicate);
+ /**
+ * Creates a {@link MongodbQuery}.
+ *
+ * @return
+ */
+ private MongodbQuery createQuery() {
+ return new SpringDataMongodbQuery(mongoOperations, entityInformation.getJavaType());
}
/**
@@ -182,6 +207,14 @@ private MongodbQuery applySorting(MongodbQuery query, Sort sort) {
return query;
}
+ if (sort instanceof QSort) {
+
+ List> orderSpecifiers = ((QSort) sort).getOrderSpecifiers();
+ query.orderBy(orderSpecifiers.toArray(new OrderSpecifier>[orderSpecifiers.size()]));
+
+ return query;
+ }
+
for (Order order : sort) {
query.orderBy(toOrder(order));
}
diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
index 8966c9a951..2670808385 100644
--- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
+++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java
@@ -47,8 +47,11 @@
import org.springframework.data.mongodb.core.MongoOperations;
import org.springframework.data.mongodb.core.query.BasicQuery;
import org.springframework.data.mongodb.repository.Person.Sex;
+import org.springframework.data.querydsl.QSort;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import com.google.common.collect.Lists;
+
/**
* Base class for tests for {@link PersonRepository}.
*
@@ -1071,4 +1074,77 @@ public void returnsOrderedResultsForQuerydslOrderSpecifier() {
assertThat(result, contains(alicia, boyd, carter, dave, leroi, oliver, stefan));
}
+
+ /**
+ * @see DATAMONGO-1085
+ */
+ @Test
+ public void shouldSupportSortingByQueryDslOrderSpecifier() {
+
+ repository.deleteAll();
+
+ List persons = new ArrayList();
+ for (int i = 0; i < 3; i++) {
+
+ Person pers = new Person(String.format("Siggi %s", i), "Bar", 30);
+ pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity"));
+
+ persons.add(pers);
+ }
+
+ repository.save(persons);
+
+ QPerson person = QPerson.person;
+
+ List result = Lists.newArrayList(repository.findAll(person.firstname.isNotNull(),
+ person.address.street.desc()));
+
+ assertThat(result, hasSize(persons.size()));
+ assertThat(result.get(0).getFirstname(), is(persons.get(2).getFirstname()));
+ }
+
+ /**
+ * @see DATAMONGO-1085
+ */
+ @Test
+ public void shouldSupportSortingWithQSortByQueryDslOrderSpecifier() throws Exception {
+
+ repository.deleteAll();
+
+ List persons = new ArrayList();
+ for (int i = 0; i < 3; i++) {
+ Person pers = new Person(String.format("Siggi %s", i), "Bar", 30);
+ pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity"));
+ persons.add(pers);
+ }
+ repository.save(persons);
+
+ PageRequest pageRequest = new PageRequest(0, 2, new QSort(person.address.street.desc()));
+ List result = Lists.newArrayList(repository.findAll(pageRequest));
+
+ assertThat(result, hasSize(pageRequest.getPageSize()));
+ assertThat(result.get(0).getFirstname(), is("Siggi 2"));
+ }
+
+ /**
+ * @see DATAMONGO-1085
+ */
+ @Test
+ public void shouldSupportSortingWithQSort() throws Exception {
+
+ repository.deleteAll();
+
+ List persons = new ArrayList();
+ for (int i = 0; i < 3; i++) {
+ Person pers = new Person(String.format("Siggi %s", i), "Bar", 30);
+ pers.setAddress(new Address(String.format("Street %s", i), "12345", "SinCity"));
+ persons.add(pers);
+ }
+ repository.save(persons);
+
+ List result = Lists.newArrayList(repository.findAll(new QSort(person.address.street.desc())));
+
+ assertThat(result, hasSize(persons.size()));
+ assertThat(result.get(0).getFirstname(), is("Siggi 2"));
+ }
}