【问题标题】:jdbcTemplate - leave field emptyjdbcTemplate - 将字段留空
【发布时间】:2020-10-11 20:47:50
【问题描述】:

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

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

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

【问题讨论】:

    标签: java spring-boot jdbc null jdbctemplate


    【解决方案1】:

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

    【讨论】:

    • 谢谢,成功了!太好了!
    猜你喜欢
    • 2021-04-01
    • 2016-04-03
    • 2013-01-11
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 2022-12-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多