Browse Source

Add default JDBCType.NULL for null values.

Signed-off-by: Sergey Korotaev <sergey.evgen.kor2501@gmail.com>

Original pull request #2068
Closes #1935
issue/1935-jdbc-sql-type-for-null
Sergey Korotaev 7 months ago committed by Jens Schauder
parent
commit
2024731051
No known key found for this signature in database
GPG Key ID: 2BE5D185CD2A1CE6
  1. 10
      spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlParametersFactory.java
  2. 92
      spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlParametersFactoryTest.java

10
spring-data-jdbc/src/main/java/org/springframework/data/jdbc/core/convert/SqlParametersFactory.java

@ -15,6 +15,7 @@
*/ */
package org.springframework.data.jdbc.core.convert; package org.springframework.data.jdbc.core.convert;
import java.sql.JDBCType;
import java.sql.SQLType; import java.sql.SQLType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -41,6 +42,7 @@ import org.springframework.util.Assert;
* @author Jens Schauder * @author Jens Schauder
* @author Chirag Tailor * @author Chirag Tailor
* @author Mikhail Polivakha * @author Mikhail Polivakha
* @author Sergey Korotaev
* @since 2.4 * @since 2.4
*/ */
public class SqlParametersFactory { public class SqlParametersFactory {
@ -187,11 +189,9 @@ public class SqlParametersFactory {
private void addConvertedValue(SqlIdentifierParameterSource parameterSource, @Nullable Object value, private void addConvertedValue(SqlIdentifierParameterSource parameterSource, @Nullable Object value,
SqlIdentifier paramName, Class<?> javaType, SQLType sqlType) { SqlIdentifier paramName, Class<?> javaType, SQLType sqlType) {
JdbcValue jdbcValue = converter.writeJdbcValue( // JdbcValue jdbcValue = value != null
value, // ? converter.writeJdbcValue(value, javaType, sqlType)
javaType, // : JdbcValue.of(null, JDBCType.NULL);
sqlType //
);
parameterSource.addValue( // parameterSource.addValue( //
paramName, // paramName, //

92
spring-data-jdbc/src/test/java/org/springframework/data/jdbc/core/convert/SqlParametersFactoryTest.java

@ -21,6 +21,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*; import static org.mockito.Mockito.*;
import static org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategyUnitTests.*; import static org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategyUnitTests.*;
import java.sql.JDBCType;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
@ -32,6 +33,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.convert.ReadingConverter; import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter; import org.springframework.data.convert.WritingConverter;
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext; import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
import org.springframework.data.jdbc.core.mapping.JdbcValue;
import org.springframework.data.relational.core.conversion.IdValueSource; import org.springframework.data.relational.core.conversion.IdValueSource;
import org.springframework.data.relational.core.mapping.Column; import org.springframework.data.relational.core.mapping.Column;
import org.springframework.data.relational.core.mapping.RelationalMappingContext; import org.springframework.data.relational.core.mapping.RelationalMappingContext;
@ -42,6 +44,7 @@ import org.springframework.jdbc.core.JdbcOperations;
* Unit tests for {@link SqlParametersFactory}. * Unit tests for {@link SqlParametersFactory}.
* *
* @author Chirag Tailor * @author Chirag Tailor
* @author Sergey Korotaev
*/ */
class SqlParametersFactoryTest { class SqlParametersFactoryTest {
@ -162,6 +165,69 @@ class SqlParametersFactoryTest {
assertThat(sqlParameterSource.getValue("val&ue")).isNull(); assertThat(sqlParameterSource.getValue("val&ue")).isNull();
} }
@Test
// GH-1935
void enumParameterIsNotNullReturnCorrectSqlTypeFromConverter() {
WithEnumEntity entity = new WithEnumEntity(23L, DummyEnum.ONE);
SqlParametersFactory sqlParametersFactory = createSqlParametersFactoryWithConverters(
singletonList(WritingEnumConverter.INSTANCE));
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
assertThat(sqlParameterSource.getValue("dummy_enum")).isEqualTo(DummyEnum.ONE.name());
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(1111);
}
@Test
// GH-1935
void enumParameterIsNullReturnCorrectSqlTypeFromConverter() {
WithEnumEntity entity = new WithEnumEntity(23L, null);
SqlParametersFactory sqlParametersFactory = createSqlParametersFactoryWithConverters(
singletonList(WritingEnumConverter.INSTANCE));
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(JDBCType.NULL.getVendorTypeNumber());
assertThat(sqlParameterSource.getValue("dummy_enum")).isNull();
}
@Test
// GH-1935
void enumParameterIsNotNullReturnCorrectSqlTypeWithoutConverter() {
WithEnumEntity entity = new WithEnumEntity(23L, DummyEnum.ONE);
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
assertThat(sqlParameterSource.getValue("dummy_enum")).isEqualTo(DummyEnum.ONE.name());
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(12);
}
@Test
// GH-1935
void enumParameterIsNullReturnCorrectSqlTypeWithoutConverter() {
WithEnumEntity entity = new WithEnumEntity(23L, null);
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(JDBCType.NULL.getVendorTypeNumber());
assertThat(sqlParameterSource.getValue("dummy_enum")).isNull();
}
@WritingConverter @WritingConverter
enum IdValueToStringConverter implements Converter<IdValue, String> { enum IdValueToStringConverter implements Converter<IdValue, String> {
@ -229,6 +295,17 @@ class SqlParametersFactoryTest {
} }
} }
@WritingConverter
enum WritingEnumConverter implements Converter<DummyEnum, JdbcValue> {
INSTANCE;
@Override
public JdbcValue convert(DummyEnum source) {
return JdbcValue.of(source.name().toUpperCase(), JDBCType.OTHER);
}
}
@WritingConverter @WritingConverter
enum BooleanToStringConverter implements Converter<Boolean, String> { enum BooleanToStringConverter implements Converter<Boolean, String> {
@ -295,6 +372,21 @@ class SqlParametersFactoryTest {
} }
} }
private static class WithEnumEntity {
@Id Long id;
DummyEnum dummyEnum;
public WithEnumEntity(Long id, DummyEnum dummyEnum) {
this.id = id;
this.dummyEnum = dummyEnum;
}
}
private enum DummyEnum {
ONE, TWO
}
private SqlParametersFactory createSqlParametersFactoryWithConverters(List<?> converters) { private SqlParametersFactory createSqlParametersFactoryWithConverters(List<?> converters) {
MappingJdbcConverter converter = new MappingJdbcConverter(context, relationResolver, MappingJdbcConverter converter = new MappingJdbcConverter(context, relationResolver,

Loading…
Cancel
Save