From 09189a4c41015448fdf9505f21b6ea200fefba53 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 15 Mar 2023 17:01:15 +0100 Subject: [PATCH] Polishing. Simplify TypeInformation creation from a MethodParameter. Original pull request: #1356 See #1343 --- .../query/StringBasedJdbcQuery.java | 21 +++++++------------ .../query/RelationalParameters.java | 10 +++++---- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java index 4ad7767f1..2c3cf8edb 100644 --- a/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java +++ b/spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java @@ -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 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(); diff --git a/spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/RelationalParameters.java b/spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/RelationalParameters.java index cce9e18f9..0d87e4482 100755 --- a/spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/RelationalParameters.java +++ b/spring-data-relational/src/main/java/org/springframework/data/relational/repository/query/RelationalParameters.java @@ -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 getTypeInformation() { + return TypeInformation.fromMethodParameter(parameter); } } }