jdbcTemplate-将字段留空

问题描述

我有一个这样生成的H2 sql数据库

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;
}

我的问题是,万一dog.getBreed()返回null的情况下,如何将品种ID保留为空?

Java不允许我设置stmt.setLong(5,null);,因为我理解long不知道null

但是,那是什么优雅的方法呢?

解决方法

@speendo-请使用java.sql.Types如下使用PreparedStatement的setNull方法:

if (dog.getBreed() != null) {
            stmt.setLong(5,dog.getBreed().getId());
} else {
            // leave breed_id field empty
            stmt.setNull(5,Types.NULL);
}