【发布时间】:2019-05-12 17:26:38
【问题描述】:
我有一个包含 20 多列的数据库,其中一些是具有空值的 date/timestamp 数据类型。
Java 应用程序将从该表中读取数据并插入到其他表中。 Prepared Statement 用于框架插入查询。插入记录时,我在日期列上得到 “空指针异常”,只要它是空的。对于Varchar,当实际值为空时自动设置为空。有什么方法可以像准备好的语句中的varchar一样自动处理具有空值的日期字段?
PreparedStatement ps = null;
....
....
ps.setDate(3, new java.sql.Date(date.getTime())); //date is Java.Util.Date
出现错误。所以我像下面这样手动处理
if(date!= null)
ps.setDate(3, new java.sql.Date(date.getTime()));
else
ps.setNull(3, Types.DATE);
【问题讨论】:
-
"Java 应用程序会从这个表中读取数据并插入到另一个表中。" 那你为什么需要创建一个新的
java.sql.Date?date不是已经是java.sql.Date(或null)了吗? -
“我在日期列上出现空指针异常” - 如果没有看到表的 DDL,则无法确定,但您遇到问题的列似乎有 NOT NULL 约束在它们上,这意味着它们不能设置为 NULL。请编辑您的问题以包含表的 DDL,包括所有列和约束,以及您遇到的错误的确切文本。谢谢。
-
java.sql.Date和java.sql.Date已过时。这些天使用LocalDate从java.time, thie modern Java date and time API 代替:ps.setObject(3, yourLocalDate);。注意:(1)使用setObjectinsteda ofsetDate。 (2) 当yourLocalDate也是null时也有效。 -
@T.J.Crowder 源表的类型为时间戳,目标表的数据类型为日期。它不需要任何时间部分。
-
@BobJarvis 谢谢。源表和目标表都不为空没有约束。源数据类型为时间戳(允许为空),目标表数据类型为日期(允许为空)。
标签: java oracle date null prepared-statement