JdbcTemplate — оставить поле пустым

#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. Спасибо, это сработало! Отлично!