jdbcTemplate - 将字段留空

jdbcTemplate - leave field empty

我有一个像这样生成的 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() returns null,如何将 breed_id 字段留空?

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

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

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

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