19
19
20
20
import java .lang .reflect .Constructor ;
21
21
import java .sql .SQLType ;
22
+ import java .sql .Types ;
22
23
import java .util .ArrayList ;
23
24
import java .util .Collection ;
24
25
import java .util .List ;
25
26
26
27
import org .springframework .beans .BeanUtils ;
27
28
import org .springframework .beans .factory .BeanFactory ;
29
+ import org .springframework .core .convert .TypeDescriptor ;
28
30
import org .springframework .core .convert .converter .Converter ;
29
31
import org .springframework .data .jdbc .core .convert .JdbcColumnTypes ;
30
32
import org .springframework .data .jdbc .core .convert .JdbcConverter ;
41
43
import org .springframework .data .repository .query .SpelEvaluator ;
42
44
import org .springframework .data .repository .query .SpelQueryContext ;
43
45
import org .springframework .data .util .TypeInformation ;
46
+ import org .springframework .expression .TypedValue ;
44
47
import org .springframework .jdbc .core .ResultSetExtractor ;
45
48
import org .springframework .jdbc .core .RowMapper ;
46
49
import org .springframework .jdbc .core .namedparam .MapSqlParameterSource ;
@@ -162,7 +165,9 @@ private String processSpelExpressions(Object[] objects, MapSqlParameterSource pa
162
165
163
166
SpelEvaluator spelEvaluator = queryContext .parse (query , getQueryMethod ().getParameters ());
164
167
165
- spelEvaluator .evaluate (objects ).forEach (parameterMap ::addValue );
168
+ spelEvaluator .evaluateWithTypeInformation (objects ).forEach ((name , typedValue ) -> {
169
+ convertAndAddParameter (parameterMap , name , typedValue );
170
+ });
166
171
167
172
return spelEvaluator .getQueryString ();
168
173
}
@@ -180,13 +185,32 @@ private MapSqlParameterSource bindParameters(RelationalParameterAccessor accesso
180
185
return parameters ;
181
186
}
182
187
183
- private void convertAndAddParameter (MapSqlParameterSource parameters , Parameter p , Object value ) {
188
+ private void convertAndAddParameter (MapSqlParameterSource parameters , String parameterName , TypedValue typedValue ) {
189
+ TypeDescriptor type = typedValue .getTypeDescriptor ();
190
+ Object value = typedValue .getValue ();
191
+
192
+ if (type != null ) {
193
+ convertAndAddParameter (parameters , parameterName , TypeInformation .of (type .getResolvableType ()), value );
194
+ } else if (value != null ) {
195
+ convertAndAddParameter (parameters , parameterName , TypeInformation .of (value .getClass ()), value );
196
+ } else {
197
+ parameters .addValue (parameterName , null , Types .NULL );
198
+ }
199
+ }
200
+
201
+ private void convertAndAddParameter (MapSqlParameterSource parameters , Parameter p , @ Nullable Object value ) {
184
202
185
203
String parameterName = p .getName ().orElseThrow (() -> new IllegalStateException (PARAMETER_NEEDS_TO_BE_NAMED ));
186
204
187
205
RelationalParameters .RelationalParameter parameter = getQueryMethod ().getParameters ().getParameter (p .getIndex ());
188
206
TypeInformation <?> typeInformation = parameter .getTypeInformation ();
189
207
208
+ convertAndAddParameter (parameters , parameterName , typeInformation , value );
209
+ }
210
+
211
+ private void convertAndAddParameter (MapSqlParameterSource parameters , String parameterName ,
212
+ TypeInformation <?> typeInformation , @ Nullable Object value ) {
213
+
190
214
JdbcValue jdbcValue ;
191
215
if (typeInformation .isCollectionLike () && value instanceof Collection <?>) {
192
216
0 commit comments