DATAJDBC-181 - Use NamingStrategy for instantiating entities.

The ResultSetParameterValueProvider uses the relevant property for a requested parameter in order to obtain the proper column name to use.

Improved mocking of ResultSets in tests to actually fail when a non existing column gets requested instead of just returning null.
This commit is contained in:
Jens Schauder
2018-03-07 14:30:20 +01:00
committed by Greg Turnquist
parent 043bd4de35
commit 18bf6ca77c
2 changed files with 70 additions and 21 deletions

View File

@@ -16,6 +16,7 @@
package org.springframework.data.jdbc.core;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.convert.ClassGeneratingEntityInstantiator;
@@ -94,7 +95,7 @@ public class EntityRowMapper<T> implements RowMapper<T> {
}
private T createInstance(ResultSet rs) {
return instantiator.createInstance(entity, ResultSetParameterValueProvider.of(rs, conversions, ""));
return instantiator.createInstance(entity, new ResultSetParameterValueProvider(rs, entity, conversions, ""));
}
private Object readFrom(ResultSet resultSet, JdbcPersistentProperty property, String prefix) {
@@ -123,7 +124,7 @@ public class EntityRowMapper<T> implements RowMapper<T> {
return null;
}
S instance = instantiator.createInstance(entity, ResultSetParameterValueProvider.of(rs, conversions, prefix));
S instance = instantiator.createInstance(entity, new ResultSetParameterValueProvider(rs, entity, conversions, prefix));
PersistentPropertyAccessor accessor = entity.getPropertyAccessor(instance);
ConvertingPropertyAccessor propertyAccessor = new ConvertingPropertyAccessor(accessor, conversions);
@@ -135,27 +136,18 @@ public class EntityRowMapper<T> implements RowMapper<T> {
return instance;
}
@RequiredArgsConstructor
private static class ResultSetParameterValueProvider implements ParameterValueProvider<JdbcPersistentProperty> {
@NonNull
private final ResultSet resultSet;
@NonNull
private final JdbcPersistentEntity<?> entity;
@NonNull
private final ConversionService conversionService;
@NonNull
private final String prefix;
private ResultSetParameterValueProvider(ResultSet resultSet, ConversionService conversionService, String prefix) {
this.resultSet = resultSet;
this.conversionService = conversionService;
this.prefix = prefix;
}
public static ResultSetParameterValueProvider of(ResultSet resultSet, ConversionService conversionService,
String prefix) {
return new ResultSetParameterValueProvider(resultSet, conversionService, prefix);
}
/*
* (non-Javadoc)
* @see org.springframework.data.mapping.model.ParameterValueProvider#getParameterValue(org.springframework.data.mapping.PreferredConstructor.Parameter)
@@ -163,12 +155,8 @@ public class EntityRowMapper<T> implements RowMapper<T> {
@Override
public <T> T getParameterValue(Parameter<T, JdbcPersistentProperty> parameter) {
String name = parameter.getName();
if (name == null) {
return null;
}
String column = prefix + entity.getRequiredPersistentProperty(parameter.getName()).getColumnName();
String column = prefix + name;
try {
return conversionService.convert(resultSet.getObject(column), parameter.getType().getType());
} catch (SQLException o_O) {