Skip to content

Commit 2024731

Browse files
serezakorotaevschauder
authored andcommitted
Add default JDBCType.NULL for null values.
Signed-off-by: Sergey Korotaev <[email protected]> Original pull request #2068 Closes #1935
1 parent 6782ed9 commit 2024731

File tree

2 files changed

+97
-5
lines changed

2 files changed

+97
-5
lines changed

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
*/
1616
package org.springframework.data.jdbc.core.convert;
1717

18+
import java.sql.JDBCType;
1819
import java.sql.SQLType;
1920
import java.util.ArrayList;
2021
import java.util.List;
@@ -41,6 +42,7 @@
4142
* @author Jens Schauder
4243
* @author Chirag Tailor
4344
* @author Mikhail Polivakha
45+
* @author Sergey Korotaev
4446
* @since 2.4
4547
*/
4648
public class SqlParametersFactory {
@@ -187,11 +189,9 @@ private void addConvertedPropertyValue(SqlIdentifierParameterSource parameterSou
187189
private void addConvertedValue(SqlIdentifierParameterSource parameterSource, @Nullable Object value,
188190
SqlIdentifier paramName, Class<?> javaType, SQLType sqlType) {
189191

190-
JdbcValue jdbcValue = converter.writeJdbcValue( //
191-
value, //
192-
javaType, //
193-
sqlType //
194-
);
192+
JdbcValue jdbcValue = value != null
193+
? converter.writeJdbcValue(value, javaType, sqlType)
194+
: JdbcValue.of(null, JDBCType.NULL);
195195

196196
parameterSource.addValue( //
197197
paramName, //

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

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import static org.mockito.Mockito.*;
2222
import static org.springframework.data.jdbc.core.convert.DefaultDataAccessStrategyUnitTests.*;
2323

24+
import java.sql.JDBCType;
2425
import java.util.ArrayList;
2526
import java.util.HashMap;
2627
import java.util.List;
@@ -32,6 +33,7 @@
3233
import org.springframework.data.convert.ReadingConverter;
3334
import org.springframework.data.convert.WritingConverter;
3435
import org.springframework.data.jdbc.core.mapping.JdbcMappingContext;
36+
import org.springframework.data.jdbc.core.mapping.JdbcValue;
3537
import org.springframework.data.relational.core.conversion.IdValueSource;
3638
import org.springframework.data.relational.core.mapping.Column;
3739
import org.springframework.data.relational.core.mapping.RelationalMappingContext;
@@ -42,6 +44,7 @@
4244
* Unit tests for {@link SqlParametersFactory}.
4345
*
4446
* @author Chirag Tailor
47+
* @author Sergey Korotaev
4548
*/
4649
class SqlParametersFactoryTest {
4750

@@ -162,6 +165,69 @@ void parameterNamesGetSanitized() {
162165
assertThat(sqlParameterSource.getValue("val&ue")).isNull();
163166
}
164167

168+
@Test
169+
// GH-1935
170+
void enumParameterIsNotNullReturnCorrectSqlTypeFromConverter() {
171+
172+
WithEnumEntity entity = new WithEnumEntity(23L, DummyEnum.ONE);
173+
174+
SqlParametersFactory sqlParametersFactory = createSqlParametersFactoryWithConverters(
175+
singletonList(WritingEnumConverter.INSTANCE));
176+
177+
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
178+
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
179+
180+
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
181+
assertThat(sqlParameterSource.getValue("dummy_enum")).isEqualTo(DummyEnum.ONE.name());
182+
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(1111);
183+
}
184+
185+
@Test
186+
// GH-1935
187+
void enumParameterIsNullReturnCorrectSqlTypeFromConverter() {
188+
WithEnumEntity entity = new WithEnumEntity(23L, null);
189+
190+
SqlParametersFactory sqlParametersFactory = createSqlParametersFactoryWithConverters(
191+
singletonList(WritingEnumConverter.INSTANCE));
192+
193+
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
194+
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
195+
196+
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
197+
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(JDBCType.NULL.getVendorTypeNumber());
198+
assertThat(sqlParameterSource.getValue("dummy_enum")).isNull();
199+
}
200+
201+
@Test
202+
// GH-1935
203+
void enumParameterIsNotNullReturnCorrectSqlTypeWithoutConverter() {
204+
205+
WithEnumEntity entity = new WithEnumEntity(23L, DummyEnum.ONE);
206+
207+
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
208+
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
209+
210+
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
211+
assertThat(sqlParameterSource.getValue("dummy_enum")).isEqualTo(DummyEnum.ONE.name());
212+
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(12);
213+
214+
}
215+
216+
@Test
217+
// GH-1935
218+
void enumParameterIsNullReturnCorrectSqlTypeWithoutConverter() {
219+
220+
WithEnumEntity entity = new WithEnumEntity(23L, null);
221+
222+
SqlIdentifierParameterSource sqlParameterSource = sqlParametersFactory.forInsert(entity,
223+
WithEnumEntity.class, Identifier.empty(), IdValueSource.PROVIDED);
224+
225+
assertThat(sqlParameterSource.getValue("id")).isEqualTo(23L);
226+
assertThat(sqlParameterSource.getSqlType("dummy_enum")).isEqualTo(JDBCType.NULL.getVendorTypeNumber());
227+
assertThat(sqlParameterSource.getValue("dummy_enum")).isNull();
228+
229+
}
230+
165231
@WritingConverter
166232
enum IdValueToStringConverter implements Converter<IdValue, String> {
167233

@@ -229,6 +295,17 @@ public String toString() {
229295
}
230296
}
231297

298+
@WritingConverter
299+
enum WritingEnumConverter implements Converter<DummyEnum, JdbcValue> {
300+
301+
INSTANCE;
302+
303+
@Override
304+
public JdbcValue convert(DummyEnum source) {
305+
return JdbcValue.of(source.name().toUpperCase(), JDBCType.OTHER);
306+
}
307+
}
308+
232309
@WritingConverter
233310
enum BooleanToStringConverter implements Converter<Boolean, String> {
234311

@@ -295,6 +372,21 @@ public WithIllegalCharacters(Long id, String value) {
295372
}
296373
}
297374

375+
private static class WithEnumEntity {
376+
@Id Long id;
377+
378+
DummyEnum dummyEnum;
379+
380+
public WithEnumEntity(Long id, DummyEnum dummyEnum) {
381+
this.id = id;
382+
this.dummyEnum = dummyEnum;
383+
}
384+
}
385+
386+
private enum DummyEnum {
387+
ONE, TWO
388+
}
389+
298390
private SqlParametersFactory createSqlParametersFactoryWithConverters(List<?> converters) {
299391

300392
MappingJdbcConverter converter = new MappingJdbcConverter(context, relationResolver,

0 commit comments

Comments
 (0)