DATAJPA-772 - Fixed accidental application of LIKE-expansions for non-String parameters.

ParameterMetadataProvider now applies LIKE-expansions only for String properties.
This commit is contained in:
Oliver Gierke
2015-08-07 16:43:16 +02:00
parent 4396fea767
commit a6cff2d144
2 changed files with 31 additions and 10 deletions

View File

@@ -225,17 +225,24 @@ class ParameterMetadataProvider {
Assert.notNull(value);
switch (type) {
case STARTING_WITH:
return String.format("%s%%", value.toString());
case ENDING_WITH:
return String.format("%%%s", value.toString());
case CONTAINING:
return String.format("%%%s%%", value.toString());
default:
return Collection.class.isAssignableFrom(expression.getJavaType())
? persistenceProvider.potentiallyConvertEmptyCollection(toCollection(value)) : value;
Class<? extends T> expressionType = expression.getJavaType();
if (String.class.equals(expressionType)) {
switch (type) {
case STARTING_WITH:
return String.format("%s%%", value.toString());
case ENDING_WITH:
return String.format("%%%s", value.toString());
case CONTAINING:
return String.format("%%%s%%", value.toString());
default:
return value;
}
}
return Collection.class.isAssignableFrom(expressionType)
? persistenceProvider.potentiallyConvertEmptyCollection(toCollection(value)) : value;
}
/**

View File

@@ -72,6 +72,18 @@ public class ParameterMetadataProviderIntegrationTests {
assertThat(metadata.getExpression().getName(), is(nullValue()));
}
/**
* @see DATAJPA-772
*/
@Test
public void doesNotApplyLikeExpansionOnNonStringProperties() throws Exception {
ParameterMetadataProvider provider = createProvider(Sample.class.getMethod("findByAgeContaining", Integer.class));
ParameterMetadata<Object> metadata = provider.next(new Part("ageContaining", User.class));
assertThat(metadata.prepare(1), is((Object) 1));
}
private ParameterMetadataProvider createProvider(Method method) {
JpaParameters parameters = new JpaParameters(method);
@@ -94,5 +106,7 @@ public class ParameterMetadataProviderIntegrationTests {
User findByFirstname(@Param("name") String firstname);
User findByLastname(String lastname);
User findByAgeContaining(@Param("age") Integer age);
}
}