From 8113b791091976d91094b46ed642deeb677243d9 Mon Sep 17 00:00:00 2001 From: Mark Pollack Date: Mon, 14 Nov 2011 23:26:16 -0500 Subject: [PATCH] DATAMONGO-315 - MongoTemplate.findOne(query) methods ignore SortOrder on query --- .../data/mongodb/core/MongoTemplate.java | 8 ++++- .../data/mongodb/core/MongoTemplateTests.java | 29 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) 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 43d5662d4..45f40de94 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 @@ -429,7 +429,13 @@ public class MongoTemplate implements MongoOperations, ApplicationContextAware { } public T findOne(Query query, Class entityClass, String collectionName) { - return doFindOne(collectionName, query.getQueryObject(), query.getFieldsObject(), entityClass); + if (query.getSortObject() == null) { + return doFindOne(collectionName, query.getQueryObject(), query.getFieldsObject(), entityClass); + } else { + query.limit(1); + List results = find(query, entityClass, collectionName); + return (results.isEmpty() ? null : results.get(0)); + } } // Find methods that take a Query to express the query and that return a List of objects. diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java index 2fbd909bd..5275f3c67 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/core/MongoTemplateTests.java @@ -117,6 +117,7 @@ public class MongoTemplateTests { protected void cleanDb() { template.dropCollection(template.getCollectionName(Person.class)); + template.dropCollection(template.getCollectionName(PersonWithAList.class)); template.dropCollection(template.getCollectionName(PersonWith_idPropertyOfTypeObjectId.class)); template.dropCollection(template.getCollectionName(PersonWith_idPropertyOfTypeString.class)); template.dropCollection(template.getCollectionName(PersonWithIdPropertyOfTypeObjectId.class)); @@ -742,8 +743,36 @@ public class MongoTemplateTests { assertThat(p4.getWishList().size(), is(1)); assertThat(p4.getFriends().size(), is(1)); + } + + @Test + public void testFindOneWithSort() { + PersonWithAList p = new PersonWithAList(); + p.setFirstName("Sven"); + p.setAge(22); + template.insert(p); + + PersonWithAList p2 = new PersonWithAList(); + p2.setFirstName("Erik"); + p2.setAge(21); + template.insert(p2); + + PersonWithAList p3 = new PersonWithAList(); + p3.setFirstName("Mark"); + p3.setAge(40); + template.insert(p3); + + + //test query with a sort + Query q2 = new Query(Criteria.where("age").gt(10)); + q2.sort().on("age", Order.DESCENDING); + PersonWithAList p5 = template.findOne(q2, PersonWithAList.class); + assertThat(p5.getFirstName(), is("Mark")); + } + + @Test public void testUsingSlaveOk() throws Exception { this.template.execute("slaveOkTest", new CollectionCallback() {