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 ac5038dfe..c0cc6e73f 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 @@ -2095,7 +2095,8 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { cursorToUse = cursorToUse.limit(query.getLimit()); } if (query.getSortObject() != null) { - cursorToUse = cursorToUse.sort(getMappedSortObject(query, type)); + DBObject sortDbo = type != null ? getMappedSortObject(query, type) : query.getSortObject(); + cursorToUse = cursorToUse.sort(sortDbo); } if (StringUtils.hasText(query.getHint())) { cursorToUse = cursorToUse.hint(query.getHint()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java index 13ed88299..565bfe09d 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateUnitTests.java @@ -42,6 +42,7 @@ import org.springframework.dao.DataAccessException; import org.springframework.dao.InvalidDataAccessApiUsageException; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Version; +import org.springframework.data.domain.Sort; import org.springframework.data.mongodb.MongoDbFactory; import org.springframework.data.mongodb.core.convert.CustomConversions; import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; @@ -49,13 +50,16 @@ import org.springframework.data.mongodb.core.convert.MappingMongoConverter; import org.springframework.data.mongodb.core.convert.QueryMapper; import org.springframework.data.mongodb.core.index.MongoPersistentEntityIndexCreator; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; +import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.test.util.ReflectionTestUtils; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DB; import com.mongodb.DBCollection; +import com.mongodb.DBCursor; import com.mongodb.DBObject; import com.mongodb.Mongo; import com.mongodb.MongoException; @@ -75,6 +79,7 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { @Mock Mongo mongo; @Mock DB db; @Mock DBCollection collection; + @Mock DBCursor cursor; MongoExceptionTranslator exceptionTranslator = new MongoExceptionTranslator(); MappingMongoConverter converter; @@ -90,7 +95,6 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { this.mappingContext = new MongoMappingContext(); this.converter = new MappingMongoConverter(new DefaultDbRefResolver(factory), mappingContext); this.template = new MongoTemplate(factory, converter); - } @Test(expected = IllegalArgumentException.class) @@ -282,6 +286,28 @@ public class MongoTemplateUnitTests extends MongoOperationsUnitTests { })); } + /** + * @see DATAMONGO-948 + */ + @Test + public void sortShouldBeTakenAsIsWhenExecutingQueryWithoutSpecificTypeInformation() { + + when(db.getCollection(Mockito.any(String.class))).thenReturn(collection); + when(collection.find(Mockito.any(DBObject.class))).thenReturn(cursor); + when(cursor.sort(Mockito.any(DBObject.class))).thenReturn(cursor); + + Query query = Query.query(Criteria.where("foo").is("bar")).with(new Sort("foo")); + template.executeQuery(query, "collection1", new DocumentCallbackHandler() { + + @Override + public void processDocument(DBObject dbObject) {} + }); + + ArgumentCaptor captor = ArgumentCaptor.forClass(DBObject.class); + verify(cursor, times(1)).sort(captor.capture()); + assertThat(captor.getValue(), equalTo(new BasicDBObjectBuilder().add("foo", 1).get())); + } + class AutogenerateableId { @Id BigInteger id;