为 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的主要内容,如果未能解决你的问题,请参考以下文章
SQLROW_NUMBER() OVER(partition by 分组列 order by 排序列)用法详解+经典实例