From f8453825fb76c70b1d8f2bd44d50c40cd9780a0d Mon Sep 17 00:00:00 2001 From: Christoph Strobl Date: Tue, 21 Oct 2014 20:24:45 +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 | 20 +++++++++++++++++++ 4 files changed, 36 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 c5b445e4e..5059f987e 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 @@ -262,6 +262,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 910f59ccd..6daa8c2f8 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 @@ -1048,4 +1048,16 @@ public abstract class AbstractPersonRepositoryIntegrationTests { slice = repository.findByAgeGreaterThan(50, slice.nextPageable()); assertThat(slice, contains(persons.subList(20, 40).toArray())); } + + /** + * @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 60ed1cbaa..9d9593742 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 @@ -317,4 +317,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 8eb1e814c..331ef08c2 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 @@ -43,6 +43,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; import com.mongodb.DBRef; @@ -273,6 +274,21 @@ public class StringBasedMongoQueryUnitTests { assertThat(dbRef.getRef(), is("reference")); } + /** + * @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); @@ -314,5 +330,9 @@ public class StringBasedMongoQueryUnitTests { @Query("{ 'reference' : { $ref : 'reference', $id : ?0 }}") Object methodWithManuallyDefinedDbRef(String id); + + @Query("{ ?0 : ?1}") + Object methodWithPlaceholderInKeyOfJsonStructure(String keyReplacement, String valueReplacement); + } }