#java #spring-boot #jdbc #null #jdbctemplate
#java #весенняя загрузка #jdbc #null #jdbctemplate
Вопрос:
У меня есть база данных SQL H2, созданная следующим образом:
CREATE TABLE IF NOT EXISTS dog
(
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
...
breed_id BIGINT, -- references to breed(id) (see next line
FOREIGN KEY (breed_id) REFERENCES breed(id)
);
Обратите внимание, что breed_id
это необязательно.
Для хранения данных в этой базе данных я использую что-то вроде
@Override
public Dog save(Dog dog) {
final String sql =
"INSERT INTO "
TABLE_NAME
" (name, [...], breed_id)"
"VALUES (?, [...], ?)";
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(connection -> {
PreparedStatement stmt = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, dog.getName());
[...]
if (dog.getBreed() != null) {
stmt.setLong(5, dog.getBreed().getId());
} else {
// leave breed_id field empty
}
return stmt;
}, keyHolder);
breed.setId(((Number)keyHolder.getKeys().get("id")).longValue());
return breed;
}
Мой вопрос в том, как оставить поле breed_id пустым в случае dog.getBreed()
возврата null
?
Java не позволила бы мне установить stmt.setLong(5, null);
, который, как я понимаю, long
не знает null
.
Однако, каков элегантный способ сделать это тогда?
Ответ №1:
@speendo — Пожалуйста, используйте метод SetNull для PreparedStatement с использованием java.sql.Types, как показано ниже:
if (dog.getBreed() != null) {
stmt.setLong(5, dog.getBreed().getId());
} else {
// leave breed_id field empty
stmt.setNull(5, Types.NULL);
}
Комментарии:
1. Спасибо, это сработало! Отлично!