Skip to content

Commit 1792bce

Browse files
committed
GH-2188 - Preserve JDBCType.OTHER in string-based queries
Signed-off-by: Mohammadali Jalalkamali <m.ali.jalalkamali@gmail.com>
1 parent 4a44507 commit 1792bce

File tree

2 files changed

+29
-3
lines changed

2 files changed

+29
-3
lines changed

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -261,10 +261,10 @@ private MapSqlParameterSource bindParameters(RelationalParameterAccessor accesso
261261
JdbcValue jdbcValue = JdbcValueBindUtil.getBindValue(converter, value, parameter);
262262
SQLType jdbcType = jdbcValue.getJdbcType();
263263

264-
if (jdbcType == JDBCType.OTHER) {
265-
parameters.addValue(parameterName, jdbcValue.getValue());
266-
} else {
264+
if (jdbcType != null) {
267265
parameters.addValue(parameterName, jdbcValue.getValue(), jdbcType.getVendorTypeNumber());
266+
} else {
267+
parameters.addValue(parameterName, jdbcValue.getValue());
268268
}
269269
}
270270

spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,18 @@ void spelCanBeUsedInsideQueries() {
416416
assertThat(paramSource.getValue().getValue("__$synthetic$__2")).isEqualTo("test-value2");
417417
}
418418

419+
@Test // GH-2188
420+
void shouldPreserveJdbcTypeOtherFromJdbcValueInStringBasedQuery() {
421+
422+
SqlParameterSource parameterSource = forMethod("findByCustomValue", Direction.class)
423+
.withCustomConverters(DirectionToOtherJdbcTypeConverter.INSTANCE)
424+
.withArguments(Direction.LEFT)
425+
.extractParameterSource();
426+
427+
assertThat(parameterSource.getSqlType("value"))
428+
.isEqualTo(JDBCType.OTHER.getVendorTypeNumber());
429+
}
430+
419431
QueryFixture forMethod(String name, Class... paramTypes) {
420432
return new QueryFixture(createMethod(name, paramTypes));
421433
}
@@ -562,6 +574,9 @@ interface MyRepository extends Repository<Object, Long> {
562574
@Lock(value = LockMode.PESSIMISTIC_READ)
563575
@Query("SELECT * FROM person WHERE id = :id")
564576
DummyEntity unsupportedWithLock(Long id);
577+
578+
@Query(value = "some sql statement") // GH-2188
579+
List<DummyEntity> findByCustomValue(@Param("value") Direction value);
565580
}
566581

567582
private static class CustomRowMapper implements RowMapper<Object> {
@@ -655,6 +670,17 @@ public String convert(ListContainer source) {
655670
}
656671
}
657672

673+
@WritingConverter // GH-2188
674+
enum DirectionToOtherJdbcTypeConverter implements Converter<Direction, JdbcValue> {
675+
676+
INSTANCE;
677+
678+
@Override
679+
public JdbcValue convert(Direction source) {
680+
return JdbcValue.of(source.name(), JDBCType.OTHER);
681+
}
682+
}
683+
658684
private static class DummyEntity {
659685
private final Long id;
660686

0 commit comments

Comments
 (0)