Browse Source

DATAMONGO-1605 - Retain type of SpEL expression result when used in @Query.

Fix issue where any result of a SpEL expression had been treated as quoted String within the resulting MongoDB query.
pull/410/merge
Christoph Strobl 9 years ago committed by Mark Paluch
parent
commit
3385d96213
  1. 12
      spring-data-mongodb/src/main/java/org/springframework/data/mongodb/repository/query/ExpressionEvaluatingParameterBinder.java
  2. 23
      spring-data-mongodb/src/test/java/org/springframework/data/mongodb/repository/query/StringBasedMongoQueryUnitTests.java

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

@ -170,6 +170,12 @@ class ExpressionEvaluatingParameterBinder { @@ -170,6 +170,12 @@ class ExpressionEvaluatingParameterBinder {
} else {
if (isExpression) {
buffer.deleteCharAt(quotationMarkIndex);
return;
}
if (quotationMark == '\'') {
buffer.replace(quotationMarkIndex, quotationMarkIndex + 1, "\"");
}
@ -199,7 +205,7 @@ class ExpressionEvaluatingParameterBinder { @@ -199,7 +205,7 @@ class ExpressionEvaluatingParameterBinder {
return (String) value;
}
return QuotedString.unquote(JSON.serialize(value));
return binding.isExpression() ? JSON.serialize(value) : QuotedString.unquote(JSON.serialize(value));
}
if (value instanceof byte[]) {
@ -213,6 +219,10 @@ class ExpressionEvaluatingParameterBinder { @@ -213,6 +219,10 @@ class ExpressionEvaluatingParameterBinder {
return base64representation;
}
if (binding.isExpression() && value instanceof String) {
return "\"" + JSON.serialize(value) + "\"";
}
return JSON.serialize(value);
}

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

@ -581,6 +581,26 @@ public class StringBasedMongoQueryUnitTests { @@ -581,6 +581,26 @@ public class StringBasedMongoQueryUnitTests {
is((DBObject) JSON.parse("{ 'lastname' : { '$regex' : '^(calamity|John regalia|regalia)'} }")));
}
@Test // DATAMONGO-1605
public void findUsingSpelShouldRetainParameterType() throws Exception {
StringBasedMongoQuery mongoQuery = createQueryForMethod("findByUsingSpel", Object.class);
ConvertingParameterAccessor accessor = StubParameterAccessor.getAccessor(converter, 100.01D);
org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accessor);
assertThat(query.getQueryObject(), is((DBObject) new BasicDBObject().append("arg0", 100.01D)));
}
@Test // DATAMONGO-1605
public void findUsingSpelShouldRetainNullValues() throws Exception {
StringBasedMongoQuery mongoQuery = createQueryForMethod("findByUsingSpel", Object.class);
ConvertingParameterAccessor accessor = StubParameterAccessor.getAccessor(converter, new Object[]{null});
org.springframework.data.mongodb.core.query.Query query = mongoQuery.createQuery(accessor);
assertThat(query.getQueryObject(), is((DBObject) new BasicDBObject().append("arg0", null)));
}
private StringBasedMongoQuery createQueryForMethod(String name, Class<?>... parameters) throws Exception {
Method method = SampleRepository.class.getMethod(name, parameters);
@ -669,5 +689,8 @@ public class StringBasedMongoQueryUnitTests { @@ -669,5 +689,8 @@ public class StringBasedMongoQueryUnitTests {
@Query("{ 'lastname' : { '$regex' : '^(?0|John ?1|?1)'} }") // use spel or some regex string this is fucking bad
Person findByLastnameRegex(String lastname, String alternative);
@Query("{ arg0 : ?#{[0]} }")
List<Person> findByUsingSpel(Object arg0);
}
}

Loading…
Cancel
Save