diff --git a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java index 35d990430..c2e17af60 100644 --- a/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java +++ b/spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java @@ -18,13 +18,14 @@ package org.springframework.data.mongodb.repository.query; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.bson.types.ObjectId; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.BasicQuery; import org.springframework.data.mongodb.core.query.Query; +import com.mongodb.util.JSON; + /** * Query to use a plain JSON String to create the {@link Query} to actually execute. * @@ -55,12 +56,9 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { } /* - * (non-Javadoc) - * - * @see - * org.springframework.data.mongodb.repository.AbstractMongoQuery#createQuery(org.springframework.data. - * repository.query.SimpleParameterAccessor, org.springframework.data.mongodb.core.core.support.convert.MongoConverter) - */ + * (non-Javadoc) + * @see org.springframework.data.mongodb.repository.query.AbstractMongoQuery#createQuery(org.springframework.data.mongodb.repository.query.ConvertingParameterAccessor) + */ @Override protected Query createQuery(ConvertingParameterAccessor accessor) { @@ -99,17 +97,6 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { } private String getParameterWithIndex(ConvertingParameterAccessor accessor, int index) { - - Object parameter = accessor.getBindableValue(index); - - if (parameter == null) { - return "null"; - } else if (parameter instanceof String || parameter.getClass().isEnum()) { - return String.format("\"%s\"", parameter); - } else if (parameter instanceof ObjectId) { - return String.format("{ '$oid' : '%s' }", parameter); - } - - return parameter.toString(); + return JSON.serialize(accessor.getBindableValue(index)); } } 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 5d436cd8e..072177203 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 @@ -64,13 +64,14 @@ public abstract class AbstractPersonRepositoryIntegrationTests { List all; @Before - public void setUp() { + public void setUp() throws InterruptedException { repository.deleteAll(); dave = new Person("Dave", "Matthews", 42); oliver = new Person("Oliver August", "Matthews", 4); carter = new Person("Carter", "Beauford", 49); + Thread.sleep(10); boyd = new Person("Boyd", "Tinsley", 45); stefan = new Person("Stefan", "Lessard", 34); leroi = new Person("Leroi", "Moore", 41); @@ -430,4 +431,24 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result.size(), is(1)); assertThat(result, hasItem(dave)); } + + /** + * @see DATAMONGO-425 + */ + @Test + public void bindsDateParameterForDerivedQueryCorrectly() { + + List result = repository.findByCreatedAtLessThan(boyd.createdAt); + assertThat(result.isEmpty(), is(false)); + } + + /** + * @see DATAMONGO-425 + */ + @Test + public void bindsDateParameterForManuallyDefinedQueryCorrectly() { + + List result = repository.findByCreatedAtLessThanManually(boyd.createdAt); + assertThat(result.isEmpty(), is(false)); + } } \ No newline at end of file diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java index 2c2b8cb31..34d6f2366 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/Person.java @@ -15,6 +15,7 @@ */ package org.springframework.data.mongodb.repository; +import java.util.Date; import java.util.Set; import org.springframework.data.mongodb.core.geo.Point; @@ -42,6 +43,7 @@ public class Person extends Contact { private Integer age; @SuppressWarnings("unused") private Sex sex; + Date createdAt; @GeoSpatialIndexed private Point location; @@ -75,6 +77,7 @@ public class Person extends Contact { this.age = age; this.sex = sex; this.email = (firstname == null ? "noone" : firstname.toLowerCase()) + "@dmband.com"; + this.createdAt = new Date(); } /** diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java index aca794603..43165e6a4 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java @@ -16,6 +16,7 @@ package org.springframework.data.mongodb.repository; import java.util.Collection; +import java.util.Date; import java.util.List; import org.springframework.data.domain.Page; @@ -153,4 +154,15 @@ public interface PersonRepository extends MongoRepository, Query GeoPage findByLocationNear(Point point, Distance maxDistance, Pageable pageable); List findByCreator(User user); + + /** + * @see DATAMONGO-425 + */ + List findByCreatedAtLessThan(Date date); + + /** + * @see DATAMONGO-425 + */ + @Query("{ 'createdAt' : { '$lt' : ?0 }}") + List findByCreatedAtLessThanManually(Date date); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests.java index 4f280a7a5..a82eb6e1f 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/config/MongoNamespaceIntegrationTests.java @@ -26,7 +26,7 @@ public class MongoNamespaceIntegrationTests extends AbstractPersonRepositoryInte @Before @Override - public void setUp() { + public void setUp() throws InterruptedException { super.setUp(); factory = new DefaultListableBeanFactory(); reader = new XmlBeanDefinitionReader(factory);