From 08e534adcd11eeed4004ab69927787251bb7ad64 Mon Sep 17 00:00:00 2001 From: Thomas Darimont Date: Wed, 22 Oct 2014 14:16:31 +0200 Subject: [PATCH] DATAMONGO-1072 - Fix annotated query placeholders not replaced correctly. We now also check field names for potential placeholder matches to ensure those are registered for binding parameters. Original pull request: #233. --- .../query/StringBasedMongoQuery.java | 1 + ...tractPersonRepositoryIntegrationTests.java | 12 ++++++++++++ .../mongodb/repository/PersonRepository.java | 3 +++ .../query/StringBasedMongoQueryUnitTests.java | 19 +++++++++++++++++++ 4 files changed, 35 insertions(+) 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 de17a672a..8fc3f2a1c 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 @@ -260,6 +260,7 @@ public class StringBasedMongoQuery extends AbstractMongoQuery { DBObject dbo = (DBObject) value; for (String field : dbo.keySet()) { + collectParameterReferencesIntoBindings(bindings, field); collectParameterReferencesIntoBindings(bindings, dbo.get(field)); } } 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 9da4a061e..19f669b4f 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 @@ -963,4 +963,16 @@ public abstract class AbstractPersonRepositoryIntegrationTests { assertThat(result.lastname, is("Beauford")); } + + /** + * @see DATAMONGO-1072 + */ + @Test + public void shouldBindPlaceholdersUsedAsKeysCorrectly() { + + List persons = repository.findByKeyValue("firstname", alicia.getFirstname()); + + assertThat(persons, hasSize(1)); + assertThat(persons, hasItem(alicia)); + } } 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 12bc93981..3fb6b4a3b 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 @@ -307,4 +307,7 @@ public interface PersonRepository extends MongoRepository, Query * @see DATAMONGO-1030 */ PersonSummary findSummaryByLastname(String lastname); + + @Query("{ ?0 : ?1 }") + List findByKeyValue(String key, String value); } diff --git a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java index 8c48a4c22..3145437af 100644 --- a/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java +++ b/spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java @@ -42,6 +42,7 @@ import org.springframework.data.mongodb.repository.Query; import org.springframework.data.repository.core.RepositoryMetadata; import com.mongodb.BasicDBObject; +import com.mongodb.BasicDBObjectBuilder; import com.mongodb.DBObject; /** @@ -255,6 +256,21 @@ public class StringBasedMongoQueryUnitTests { assertThat(query.getQueryObject(), is(reference.getQueryObject())); } + /** + * @see DATAMONGO-1072 + */ + @Test + public void shouldParseJsonKeyReplacementCorrectly() throws Exception { + + StringBasedMongoQuery mongoQuery = createQueryForMethod("methodWithPlaceholderInKeyOfJsonStructure", String.class, + String.class); + ConvertingParameterAccessor parameterAccessor = StubParameterAccessor.getAccessor(converter, "key", "value"); + + org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(parameterAccessor); + + assertThat(query.getQueryObject(), is(new BasicDBObjectBuilder().add("key", "value").get())); + } + private StringBasedMongoQuery createQueryForMethod(String name, Class... parameters) throws Exception { Method method = SampleRepository.class.getMethod(name, parameters); @@ -293,5 +309,8 @@ public class StringBasedMongoQueryUnitTests { @Query(value = "{$where: 'return this.date.getUTCMonth() == ?2 && this.date.getUTCDay() == ?3;'}") List findByQueryWithParametersInExpression(int param1, int param2, int param3, int param4); + + @Query("{ ?0 : ?1}") + Object methodWithPlaceholderInKeyOfJsonStructure(String keyReplacement, String valueReplacement); } }