Skip to content

Commit 9324ae2

Browse files
committed
DATADOC-137 - Repositories now correctly replace multiple placeholders in JSON based queries.
When annotation a repository method with e.g. @query("{ 'firstname' : ?0, 'lastname' : ?1 }") all placeholders get now replaced correctly. Added unit tests and fixed broken logging in StringBasedQueryCreator,
1 parent adc56ce commit 9324ae2

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ protected Query createQuery(ConvertingParameterAccessor accessor) {
7272
}
7373

7474
if (LOG.isDebugEnabled()) {
75-
LOG.debug(String.format("Created query {}", query.getQueryObject()));
75+
LOG.debug(String.format("Created query %s", query.getQueryObject()));
7676
}
7777

7878
return query;
@@ -86,7 +86,7 @@ private String replacePlaceholders(String input, ConvertingParameterAccessor acc
8686
while (matcher.find()) {
8787
String group = matcher.group();
8888
int index = Integer.parseInt(matcher.group(1));
89-
result = input.replace(group, getParameterWithIndex(accessor, index));
89+
result = result.replace(group, getParameterWithIndex(accessor, index));
9090
}
9191

9292
return result;

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

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,35 @@ public void bindsComplexPropertyCorrectly() throws Exception {
9292
assertThat(query.getQueryObject(), is(reference.getQueryObject()));
9393
}
9494

95+
@Test
96+
public void bindsMultipleParametersCorrectly() throws SecurityException, NoSuchMethodException {
97+
98+
Method method = SampleRepository.class.getMethod("findByLastnameAndAddress", String.class, Address.class);
99+
MongoQueryMethod queryMethod = new MongoQueryMethod(method, metadata, creator);
100+
StringBasedMongoQuery mongoQuery = new StringBasedMongoQuery(queryMethod, template);
101+
102+
Address address = new Address("Foo", "0123", "Bar");
103+
ConvertingParameterAccessor accesor = StubParameterAccessor.getAccessor(converter, "Matthews", address);
104+
105+
DBObject addressDbObject = new BasicDBObject();
106+
converter.write(address, addressDbObject);
107+
108+
DBObject reference = new BasicDBObject("address", addressDbObject);
109+
reference.put("lastname", "Matthews");
110+
111+
org.springframework.data.document.mongodb.query.Query query = mongoQuery.createQuery(accesor);
112+
assertThat(query.getQueryObject(), is(reference));
113+
}
114+
95115
private interface SampleRepository {
96116

97117
@Query("{ 'lastname' : ?0 }")
98118
Person findByLastname(String lastname);
99119

100120
@Query("{ 'address' : ?0 }")
101121
Person findByAddress(Address address);
122+
123+
@Query("{ 'lastname' : ?0, 'address' : ?1 }")
124+
Person findByLastnameAndAddress(String lastname, Address address);
102125
}
103126
}

0 commit comments

Comments
 (0)