2525
2626import org .springframework .beans .BeanUtils ;
2727import org .springframework .beans .factory .BeanFactory ;
28- import org .springframework .core .ResolvableType ;
2928import org .springframework .core .convert .converter .Converter ;
3029import org .springframework .data .jdbc .core .convert .JdbcColumnTypes ;
3130import org .springframework .data .jdbc .core .convert .JdbcConverter ;
4140import org .springframework .data .repository .query .ResultProcessor ;
4241import org .springframework .data .repository .query .SpelEvaluator ;
4342import org .springframework .data .repository .query .SpelQueryContext ;
43+ import org .springframework .data .util .TypeInformation ;
4444import org .springframework .jdbc .core .ResultSetExtractor ;
4545import org .springframework .jdbc .core .RowMapper ;
4646import org .springframework .jdbc .core .namedparam .MapSqlParameterSource ;
@@ -185,23 +185,18 @@ private void convertAndAddParameter(MapSqlParameterSource parameters, Parameter
185185 String parameterName = p .getName ().orElseThrow (() -> new IllegalStateException (PARAMETER_NEEDS_TO_BE_NAMED ));
186186
187187 RelationalParameters .RelationalParameter parameter = getQueryMethod ().getParameters ().getParameter (p .getIndex ());
188- ResolvableType resolvableType = parameter .getResolvableType ();
189- Class <?> type = resolvableType .resolve ();
190- Assert .notNull (type , "@Query parameter type could not be resolved" );
188+ TypeInformation <?> typeInformation = parameter .getTypeInformation ();
191189
192190 JdbcValue jdbcValue ;
193- if (value instanceof Collection && resolvableType . hasGenerics () ) {
191+ if (typeInformation . isCollectionLike () && value instanceof Collection <?> ) {
194192
195193 List <Object > mapped = new ArrayList <>();
196194 SQLType jdbcType = null ;
197195
198- Class <?> elementType = resolvableType .getGeneric (0 ).resolve ();
199-
200- Assert .notNull (elementType , "@Query Iterable parameter generic type could not be resolved" );
201-
196+ TypeInformation <?> actualType = typeInformation .getRequiredActualType ();
202197 for (Object o : (Iterable <?>) value ) {
203- JdbcValue elementJdbcValue = converter .writeJdbcValue (o , elementType ,
204- JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (elementType )));
198+ JdbcValue elementJdbcValue = converter .writeJdbcValue (o , actualType . getType () ,
199+ JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (actualType . getType () )));
205200 if (jdbcType == null ) {
206201 jdbcType = elementJdbcValue .getJdbcType ();
207202 }
@@ -211,8 +206,8 @@ private void convertAndAddParameter(MapSqlParameterSource parameters, Parameter
211206
212207 jdbcValue = JdbcValue .of (mapped , jdbcType );
213208 } else {
214- jdbcValue = converter .writeJdbcValue (value , type ,
215- JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (type )));
209+ jdbcValue = converter .writeJdbcValue (value , typeInformation . getType () ,
210+ JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (typeInformation . getType () )));
216211 }
217212
218213 SQLType jdbcType = jdbcValue .getJdbcType ();
0 commit comments