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 @@ @@ -15,6 +15,7 @@
*/
package org.springframework.data.jdbc.core.convert;
import java.sql.JDBCType;
import java.sql.SQLType;
import java.util.ArrayList;
import java.util.List;
@ -41,6 +42,7 @@ import org.springframework.util.Assert; @@ -41,6 +42,7 @@ import org.springframework.util.Assert;
* @author Jens Schauder
* @author Chirag Tailor
* @author Mikhail Polivakha
* @author Sergey Korotaev
* @since 2.4
*/
public class SqlParametersFactory {
@ -187,11 +189,9 @@ public class SqlParametersFactory { @@ -187,11 +189,9 @@ public class SqlParametersFactory {
private void addConvertedValue(SqlIdentifierParameterSource parameterSource, @Nullable Object value,
SqlIdentifier paramName, Class<?> javaType, SQLType sqlType) {
JdbcValue jdbcValue = converter.writeJdbcValue( //
value, //
javaType, //
sqlType //
);
JdbcValue jdbcValue = value != null
? converter.writeJdbcValue(value, javaType, sqlType)
: JdbcValue.of(null, JDBCType.NULL);
parameterSource.addValue( //
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.*; @@ -21,6 +21,7 @@ import static org.assertj.core.api.Assertions.*;
import static org.mockito.Mockito.*;
import static org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategyUnitTests.*;
import java.sql.JDBCType;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@ -32,6 +33,7 @@ import org.springframework.data.annotation.Id; @@ -32,6 +33,7 @@ import org.springframework.data.annotation.Id;
import org.springframework.data.convert.ReadingConverter;
import org.springframework.data.convert.WritingConverter;
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.mapping.Column;
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
@ -42,6 +44,7 @@ import org.springframework.jdbc.core.JdbcOperations; @@ -42,6 +44,7 @@ import org.springframework.jdbc.core.JdbcOperations;
* Unit tests for {@link SqlParametersFactory}.
*
* @author Chirag Tailor
* @author Sergey Korotaev
*/
class SqlParametersFactoryTest {
@ -162,6 +165,69 @@ class SqlParametersFactoryTest { @@ -162,6 +165,69 @@ class SqlParametersFactoryTest {
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
enum IdValueToStringConverter implements Converter<IdValue, String> {
@ -229,6 +295,17 @@ class SqlParametersFactoryTest { @@ -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
enum BooleanToStringConverter implements Converter<Boolean, String> {
@ -295,6 +372,21 @@ class SqlParametersFactoryTest { @@ -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) {
MappingJdbcConverter converter = new MappingJdbcConverter(context, relationResolver,

Loading…
Cancel
Save