diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java index 3bf36ec7a..6e8756e71 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/query/Query.java @@ -44,7 +44,7 @@ public class Query { return this; } - protected Query or(Query... queries) { + public Query or(Query... queries) { this.criteria.put("$or", new OrCriteria(queries)); return this; } diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java index f5478b68d..eef11343f 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/document/mongodb/repository/MongoQueryCreator.java @@ -18,7 +18,6 @@ package org.springframework.data.document.mongodb.repository; import static org.springframework.data.document.mongodb.query.Criteria.*; import java.util.Collection; -import java.util.Collections; import java.util.Iterator; import java.util.regex.Pattern; @@ -41,7 +40,7 @@ import org.springframework.data.repository.query.parser.PartTree; * * @author Oliver Gierke */ -class MongoQueryCreator extends AbstractQueryCreator { +class MongoQueryCreator extends AbstractQueryCreator { private static final Logger LOG = LoggerFactory.getLogger(MongoQueryCreator.class); @@ -64,10 +63,12 @@ class MongoQueryCreator extends AbstractQueryCreator { * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#create(org.springframework.data.repository.query.parser.Part, java.util.Iterator) */ @Override - protected Criteria create(Part part, Iterator iterator) { + protected Query create(Part part, Iterator iterator) { - return from(part.getType(), + Criteria criteria = from(part.getType(), where(part.getProperty().toDotPath()), iterator); + + return new Query(criteria); } @@ -76,11 +77,12 @@ class MongoQueryCreator extends AbstractQueryCreator { * @see org.springframework.data.repository.query.parser.AbstractQueryCreator#and(org.springframework.data.repository.query.parser.Part, java.lang.Object, java.util.Iterator) */ @Override - protected Criteria and(Part part, Criteria base, + protected Query and(Part part, Query base, Iterator iterator) { - return from(part.getType(), where(part.getProperty().toDotPath()), + Criteria criteria = from(part.getType(), where(part.getProperty().toDotPath()), iterator); + return base.and(criteria); } @@ -92,10 +94,9 @@ class MongoQueryCreator extends AbstractQueryCreator { * #or(java.lang.Object, java.lang.Object) */ @Override - protected Criteria or(Criteria base, Criteria criteria) { - - base.or(Collections.singletonList(new Query(criteria))); - return base; + protected Query or(Query base, Query query) { + + return new Query().or(base, query); } @@ -107,9 +108,7 @@ class MongoQueryCreator extends AbstractQueryCreator { * #complete(java.lang.Object, org.springframework.data.domain.Sort) */ @Override - protected Query complete(Criteria criteria, Sort sort) { - - Query query = new Query(criteria); + protected Query complete(Query query, Sort sort) { if (LOG.isDebugEnabled()) { LOG.debug("Created query " + query.getQueryObject()); diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java index f4c3be616..aafac0e8f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java @@ -179,4 +179,20 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result.size(), is(3)); assertThat(result, hasItems(dave, leroi, stefan)); } + + @Test + public void findsPeopleByLastnameLikeAndAgeIn() throws Exception { + + List result = repository.findByLastnameLikeAndAgeBetween("*e*", 44, 50); + assertThat(result.size(), is(2)); + assertThat(result, hasItems(carter, boyd)); + } + + @Test + public void findsPeopleWithAndAndOr() throws Exception { + + List result = repository.findByAgeOrLastnameLikeAndFirstnameLike(45, "*ss*", "*a*"); + assertThat(result.size(), is(2)); + assertThat(result, hasItems(boyd, stefan)); + } } \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java index 0f9b73153..b0872dd3e 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/Person.java @@ -192,4 +192,12 @@ public class Person { return id.hashCode(); } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + return String.format("%s %s", firstname, lastname); + } } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java index 9eb934c69..232d40af7 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/document/mongodb/repository/PersonRepository.java @@ -113,4 +113,8 @@ public interface PersonRepository extends MongoRepository { List findByAddressZipCode(String zipCode); + + List findByLastnameLikeAndAgeBetween(String lastname, int from, int to); + + List findByAgeOrLastnameLikeAndFirstnameLike(int age, String lastname, String firstname); }