Skip to content

Commit f845382

Browse files
christophstroblThomas Darimont
authored andcommitted
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: spring-projects#233.
1 parent 6cda9ab commit f845382

File tree

4 files changed

+36
-0
lines changed

4 files changed

+36
-0
lines changed

spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQuery.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,7 @@ private void collectParameterReferencesIntoBindings(List<ParameterBinding> bindi
262262
DBObject dbo = (DBObject) value;
263263

264264
for (String field : dbo.keySet()) {
265+
collectParameterReferencesIntoBindings(bindings, field);
265266
collectParameterReferencesIntoBindings(bindings, dbo.get(field));
266267
}
267268
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/AbstractPersonRepositoryIntegrationTests.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1048,4 +1048,16 @@ public void sliceShouldTraverseElementsWithoutSkippingOnes() {
10481048
slice = repository.findByAgeGreaterThan(50, slice.nextPageable());
10491049
assertThat(slice, contains(persons.subList(20, 40).toArray()));
10501050
}
1051+
1052+
/**
1053+
* @see DATAMONGO-1072
1054+
*/
1055+
@Test
1056+
public void shouldBindPlaceholdersUsedAsKeysCorrectly() {
1057+
1058+
List<Person> persons = repository.findByKeyValue("firstname", alicia.getFirstname());
1059+
1060+
assertThat(persons, hasSize(1));
1061+
assertThat(persons, hasItem(alicia));
1062+
}
10511063
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/PersonRepository.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,4 +317,7 @@ public interface PersonRepository extends MongoRepository<Person, String>, Query
317317
* @see DATAMONGO-1030
318318
*/
319319
PersonSummary findSummaryByLastname(String lastname);
320+
321+
@Query("{ ?0 : ?1 }")
322+
List<Person> findByKeyValue(String key, String value);
320323
}

spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import org.springframework.data.repository.core.RepositoryMetadata;
4444

4545
import com.mongodb.BasicDBObject;
46+
import com.mongodb.BasicDBObjectBuilder;
4647
import com.mongodb.DBObject;
4748
import com.mongodb.DBRef;
4849

@@ -273,6 +274,21 @@ public void parsesDbRefDeclarationsCorrectly() throws Exception {
273274
assertThat(dbRef.getRef(), is("reference"));
274275
}
275276

277+
/**
278+
* @see DATAMONGO-1072
279+
*/
280+
@Test
281+
public void shouldParseJsonKeyReplacementCorrectly() throws Exception {
282+
283+
StringBasedMongoQuery mongoQuery = createQueryForMethod("methodWithPlaceholderInKeyOfJsonStructure", String.class,
284+
String.class);
285+
ConvertingParameterAccessor parameterAccessor = StubParameterAccessor.getAccessor(converter, "key", "value");
286+
287+
org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(parameterAccessor);
288+
289+
assertThat(query.getQueryObject(), is(new BasicDBObjectBuilder().add("key", "value").get()));
290+
}
291+
276292
private StringBasedMongoQuery createQueryForMethod(String name, Class<?>... parameters) throws Exception {
277293

278294
Method method = SampleRepository.class.getMethod(name, parameters);
@@ -314,5 +330,9 @@ private interface SampleRepository {
314330

315331
@Query("{ 'reference' : { $ref : 'reference', $id : ?0 }}")
316332
Object methodWithManuallyDefinedDbRef(String id);
333+
334+
@Query("{ ?0 : ?1}")
335+
Object methodWithPlaceholderInKeyOfJsonStructure(String keyReplacement, String valueReplacement);
336+
317337
}
318338
}

0 commit comments

Comments
 (0)