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() {