Browse Source

GH-2188 - Preserve JDBCType.OTHER in string-based queries

Signed-off-by: Mohammadali Jalalkamali <m.ali.jalalkamali@gmail.com>
pull/2193/head
Mohammadali Jalalkamali 2 weeks ago
parent
commit
569cd9cad2
  1. 6
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQuery.java
  2. 26
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/repository/query/StringBasedJdbcQueryUnitTests.java

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

@ -261,10 +261,10 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery { @@ -261,10 +261,10 @@ public class StringBasedJdbcQuery extends AbstractJdbcQuery {
JdbcValue jdbcValue = JdbcValueBindUtil.getBindValue(converter, value, parameter);
SQLType jdbcType = jdbcValue.getJdbcType();
if (jdbcType == JDBCType.OTHER) {
parameters.addValue(parameterName, jdbcValue.getValue());
} else {
if (jdbcType != null) {
parameters.addValue(parameterName, jdbcValue.getValue(), jdbcType.getVendorTypeNumber());
} else {
parameters.addValue(parameterName, jdbcValue.getValue());
}
}

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

@ -416,6 +416,18 @@ class StringBasedJdbcQueryUnitTests { @@ -416,6 +416,18 @@ class StringBasedJdbcQueryUnitTests {
assertThat(paramSource.getValue().getValue("__$synthetic$__2")).isEqualTo("test-value2");
}
@Test // GH-2188
void shouldPreserveJdbcTypeOtherFromJdbcValueInStringBasedQuery() {
SqlParameterSource parameterSource = forMethod("findByCustomValue", Direction.class)
.withCustomConverters(DirectionToOtherJdbcTypeConverter.INSTANCE)
.withArguments(Direction.LEFT)
.extractParameterSource();
assertThat(parameterSource.getSqlType("value"))
.isEqualTo(JDBCType.OTHER.getVendorTypeNumber());
}
QueryFixture forMethod(String name, Class... paramTypes) {
return new QueryFixture(createMethod(name, paramTypes));
}
@ -562,6 +574,9 @@ class StringBasedJdbcQueryUnitTests { @@ -562,6 +574,9 @@ class StringBasedJdbcQueryUnitTests {
@Lock(value = LockMode.PESSIMISTIC_READ)
@Query("SELECT * FROM person WHERE id = :id")
DummyEntity unsupportedWithLock(Long id);
@Query(value = "some sql statement") // GH-2188
List<DummyEntity> findByCustomValue(@Param("value") Direction value);
}
private static class CustomRowMapper implements RowMapper<Object> {
@ -655,6 +670,17 @@ class StringBasedJdbcQueryUnitTests { @@ -655,6 +670,17 @@ class StringBasedJdbcQueryUnitTests {
}
}
@WritingConverter // GH-2188
enum DirectionToOtherJdbcTypeConverter implements Converter<Direction, JdbcValue> {
INSTANCE;
@Override
public JdbcValue convert(Direction source) {
return JdbcValue.of(source.name(), JDBCType.OTHER);
}
}
private static class DummyEntity {
private final Long id;

Loading…
Cancel
Save