【问题标题】:Inserting NULL for NUMBER column为 NUMBER 列插入 NULL
【发布时间】:2017-06-29 11:45:39
【问题描述】:

我正在尝试在 H2 数据库中为我的 NUMBER 列插入 NULL 值。 在我的 Java 模型中,相应的值是 Long(不是原始的)。现在,我知道如果未指定,JDBC 驱动程序如何为空值插入 0,但我正是这样做的。 我的 DAO 层在 Spring 中,对于这个确切的列,我以这种方式映射它的值。

if(user.getDefaultNumber() == null){
      map.addValue("defaultNumber", user.getDefaultNumber(), Types.NULL);
}else{
      map.addValue("defaultNumber", user.getDefaultNumber());
} 

但是,这似乎不起作用。我已经深入到 Spring Core 类中对其进行了跟踪,并且我的对象的 null 值在那里,但在某个地方它仍然变成了 0。

谁能帮帮我,这让我困扰了好几天。

【问题讨论】:

  • Types.Integer 应该可以解决问题
  • @eduyayo 谢谢你的建议,这对我有用。我会将此作为答案发布,并专门针对我的案例添加一些内容

标签: java sql spring jdbc


【解决方案1】:

请尝试 PreparedStatement 在整数列中保存空值

pst.setNull(4, java.sql.Types.INTEGER); 

enter link description here

【讨论】:

  • 不幸的是,这是不可能的,架构相当大,并且已经设置为使用 Spring 的值映射。因此,直接调用 PreparedStatements 不是一种选择,但上面评论中的建议起到了作用。还是谢谢
【解决方案2】:

问题的解决方案是添加 Types.Integer。我仍然不确定为什么它不能与 Types.NULL 一起使用,但我会进行调查。目前这是解决方案

if(user.getDefaultNumber() == null){
      map.addValue("defaultNumber", user.getDefaultNumber(), Types.INTEGER);
}else{
      map.addValue("defaultNumber", user.getDefaultNumber());
}

此外,从数据库读取时正确映射它非常重要。 JDBC 将从数据库中读取 NULL,但仍会在 Java 的属性中插入 0。因此,如果读取处理不当,可能会留下这样的印象,即即使写入部分实际上还可以,问题仍然存在。

【讨论】:

    猜你喜欢
    • 2022-01-22
    • 2018-04-13
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多