Skip to content

Commit 095c0b2

Browse files
committed
GH-1577 refactor StringBasedJdbcQuery to use SpEL type information
1 parent 518e49d commit 095c0b2

File tree

1 file changed

+26
-2
lines changed

1 file changed

+26
-2
lines changed

spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@
1919

2020
import java.lang.reflect.Constructor;
2121
import java.sql.SQLType;
22+
import java.sql.Types;
2223
import java.util.ArrayList;
2324
import java.util.Collection;
2425
import java.util.List;
2526

2627
import org.springframework.beans.BeanUtils;
2728
import org.springframework.beans.factory.BeanFactory;
29+
import org.springframework.core.convert.TypeDescriptor;
2830
import org.springframework.core.convert.converter.Converter;
2931
import org.springframework.data.jdbc.core.convert.JdbcColumnTypes;
3032
import org.springframework.data.jdbc.core.convert.JdbcConverter;
@@ -41,6 +43,7 @@
4143
import org.springframework.data.repository.query.SpelEvaluator;
4244
import org.springframework.data.repository.query.SpelQueryContext;
4345
import org.springframework.data.util.TypeInformation;
46+
import org.springframework.expression.TypedValue;
4447
import org.springframework.jdbc.core.ResultSetExtractor;
4548
import org.springframework.jdbc.core.RowMapper;
4649
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
@@ -162,7 +165,9 @@ private String processSpelExpressions(Object[] objects, MapSqlParameterSource pa
162165

163166
SpelEvaluator spelEvaluator = queryContext.parse(query, getQueryMethod().getParameters());
164167

165-
spelEvaluator.evaluate(objects).forEach(parameterMap::addValue);
168+
spelEvaluator.evaluateWithTypeInformation(objects).forEach((name, typedValue) -> {
169+
convertAndAddParameter(parameterMap, name, typedValue);
170+
});
166171

167172
return spelEvaluator.getQueryString();
168173
}
@@ -180,13 +185,32 @@ private MapSqlParameterSource bindParameters(RelationalParameterAccessor accesso
180185
return parameters;
181186
}
182187

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) {
184202

185203
String parameterName = p.getName().orElseThrow(() -> new IllegalStateException(PARAMETER_NEEDS_TO_BE_NAMED));
186204

187205
RelationalParameters.RelationalParameter parameter = getQueryMethod().getParameters().getParameter(p.getIndex());
188206
TypeInformation<?> typeInformation = parameter.getTypeInformation();
189207

208+
convertAndAddParameter(parameters, parameterName, typeInformation, value);
209+
}
210+
211+
private void convertAndAddParameter(MapSqlParameterSource parameters, String parameterName,
212+
TypeInformation<?> typeInformation, @Nullable Object value) {
213+
190214
JdbcValue jdbcValue;
191215
if (typeInformation.isCollectionLike() && value instanceof Collection<?>) {
192216

0 commit comments

Comments
 (0)