Polishing.

Simplify TypeInformation creation from a MethodParameter.

Original pull request: #1356
See #1343
This commit is contained in:
Mark Paluch
2023-03-15 17:01:15 +01:00
parent d1e039a387
commit 09189a4c41
2 changed files with 14 additions and 17 deletions

View File

@@ -25,7 +25,6 @@ import java.util.List;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.core.ResolvableType;
import org.springframework.core.convert.converter.Converter;
import org.springframework.data.jdbc.core.convert.JdbcColumnTypes;
import org.springframework.data.jdbc.core.convert.JdbcConverter;
@@ -41,6 +40,7 @@ import org.springframework.data.repository.query.QueryMethodEvaluationContextPro
import org.springframework.data.repository.query.ResultProcessor;
import org.springframework.data.repository.query.SpelEvaluator;
import org.springframework.data.repository.query.SpelQueryContext;
import org.springframework.data.util.TypeInformation;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@@ -185,23 +185,18 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
String parameterName = p.getName().orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED));
RelationalParameters.RelationalParameter parameter = getQueryMethod().getParameters().getParameter(p.getIndex());
ResolvableType resolvableType = parameter.getResolvableType();
Class<?> type = resolvableType.resolve();
Assert.notNull(type, "@Query parameter type could not be resolved");
TypeInformation<?> typeInformation = parameter.getTypeInformation();
JdbcValue jdbcValue;
if (value instanceof Collection && resolvableType.hasGenerics()) {
if (typeInformation.isCollectionLike() && value instanceof Collection<?>) {
List<Object> mapped = new ArrayList<>();
SQLType jdbcType = null;
Class<?> elementType = resolvableType.getGeneric(0).resolve();
Assert.notNull(elementType, "@Query Iterable parameter generic type could not be resolved");
TypeInformation<?> actualType = typeInformation.getRequiredActualType();
for (Object o : (Iterable<?>) value) {
JdbcValue elementJdbcValue = converter.writeJdbcValue(o, elementType,
JdbcUtil.targetSqlTypeFor(JdbcColumnTypes.INSTANCE.resolvePrimitiveType(elementType)));
JdbcValue elementJdbcValue = converter.writeJdbcValue(o, actualType.getType(),
JdbcUtil.targetSqlTypeFor(JdbcColumnTypes.INSTANCE.resolvePrimitiveType(actualType.getType())));
if (jdbcType == null) {
jdbcType = elementJdbcValue.getJdbcType();
}
@@ -211,8 +206,8 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
jdbcValue = JdbcValue.of(mapped, jdbcType);
} else {
jdbcValue = converter.writeJdbcValue(value, type,
JdbcUtil.targetSqlTypeFor(JdbcColumnTypes.INSTANCE.resolvePrimitiveType(type)));
jdbcValue = converter.writeJdbcValue(value, typeInformation.getType(),
JdbcUtil.targetSqlTypeFor(JdbcColumnTypes.INSTANCE.resolvePrimitiveType(typeInformation.getType())));
}
SQLType jdbcType = jdbcValue.getJdbcType();

View File

@@ -16,7 +16,6 @@
package org.springframework.data.relational.repository.query;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.List;
import org.springframework.core.MethodParameter;
@@ -24,6 +23,7 @@ import org.springframework.core.ResolvableType;
import org.springframework.data.relational.repository.query.RelationalParameters.RelationalParameter;
import org.springframework.data.repository.query.Parameter;
import org.springframework.data.repository.query.Parameters;
import org.springframework.data.util.TypeInformation;
/**
* Custom extension of {@link Parameters}.
@@ -75,10 +75,12 @@ public class RelationalParameters extends Parameters<RelationalParameters, Relat
this.parameter = parameter;
}
public ResolvableType getResolvableType() {
return ResolvableType
.forClassWithGenerics(super.getType(), ResolvableType.forMethodParameter(this.parameter).getGenerics());
return getTypeInformation().toTypeDescriptor().getResolvableType();
}
public TypeInformation<?> getTypeInformation() {
return TypeInformation.fromMethodParameter(parameter);
}
}
}