为 NUMBER 列插入 NULL

Posted

技术标签:

【中文标题】为 NUMBER 列插入 NULL【英文标题】:Inserting NULL for NUMBER column 【发布时间】: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 谢谢你的建议,这对我有用。我会将此作为答案发布,并专门针对我的案例添加一些内容 【参考方案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。因此,如果读取处理不当,可能会留下这样的印象,即即使写入部分实际上还可以,问题仍然存在。

【讨论】:

以上是关于为 NUMBER 列插入 NULL的主要内容,如果未能解决你的问题,请参考以下文章

数据类型

sql中,如何插入一列数字从1到100

根据 row_number() 更新列

sql语句之拆分两列数据为多条

两者都在模型子句中的列之间引用

SQLROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例