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 ;
@@ -184,23 +184,18 @@ private void convertAndAddParameter(MapSqlParameterSource parameters, Parameter
184184String parameterName = p .getName ().orElseThrow (() -> new IllegalStateException (PARAMETER_NEEDS_TO_BE_NAMED ));
185185
186186RelationalParameters .RelationalParameter parameter = queryMethod .getParameters ().getParameter (p .getIndex ());
187- ResolvableType resolvableType = parameter .getResolvableType ();
188- Class <?> type = resolvableType .resolve ();
189- Assert .notNull (type , "@Query parameter type could not be resolved" );
187+ TypeInformation <?> typeInformation = parameter .getTypeInformation ();
190188
191189JdbcValue jdbcValue ;
192- if (value instanceof Collection && resolvableType . hasGenerics () ) {
190+ if (typeInformation . isCollectionLike () && value instanceof Collection <?> ) {
193191
194192List <Object > mapped = new ArrayList <>();
195193SQLType jdbcType = null ;
196194
197- Class <?> elementType = resolvableType .getGeneric (0 ).resolve ();
198-
199- Assert .notNull (elementType , "@Query Iterable parameter generic type could not be resolved" );
200-
195+ TypeInformation <?> actualType = typeInformation .getRequiredActualType ();
201196for (Object o : (Iterable <?>) value ) {
202- JdbcValue elementJdbcValue = converter .writeJdbcValue (o , elementType ,
203- JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (elementType )));
197+ JdbcValue elementJdbcValue = converter .writeJdbcValue (o , actualType . getType () ,
198+ JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (actualType . getType () )));
204199if (jdbcType == null ) {
205200jdbcType = elementJdbcValue .getJdbcType ();
206201}
@@ -210,8 +205,8 @@ private void convertAndAddParameter(MapSqlParameterSource parameters, Parameter
210205
211206jdbcValue = JdbcValue .of (mapped , jdbcType );
212207} else {
213- jdbcValue = converter .writeJdbcValue (value , type ,
214- JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (type )));
208+ jdbcValue = converter .writeJdbcValue (value , typeInformation . getType () ,
209+ JdbcUtil .targetSqlTypeFor (JdbcColumnTypes .INSTANCE .resolvePrimitiveType (typeInformation . getType () )));
215210}
216211
217212SQLType jdbcType = jdbcValue .getJdbcType ();
0 commit comments