【问题标题】:Proper way to handle null value for Oracle Date datatype in prepared statement在准备好的语句中处理 Oracle Date 数据类型的空值的正确方法
【发布时间】: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.Datedate 不是已经是 java.sql.Date(或 null)了吗?
  • “我在日期列上出现空指针异常” - 如果没有看到表的 DDL,则无法确定,但您遇到问题的列似乎有 NOT NULL 约束在它们上,这意味着它们不能设置为 NULL。请编辑您的问题以包含表的 DDL,包括所有列和约束,以及您遇到的错误的确切文本。谢谢。
  • java.sql.Datejava.sql.Date 已过时。这些天使用LocalDatejava.time, thie modern Java date and time API 代替:ps.setObject(3, yourLocalDate);。注意:(1)使用setObject insteda of setDate。 (2) 当yourLocalDate 也是null 时也有效。
  • @T.J.Crowder 源表的类型为时间戳,目标表的数据类型为日期。它不需要任何时间部分。
  • @BobJarvis 谢谢。源表和目标表都不为空没有约束。源数据类型为时间戳(允许为空),目标表数据类型为日期(允许为空)。

标签: java oracle date null prepared-statement


【解决方案1】:

当然,问题在于您尝试在date 上调用getTime,可能是null

Java 应用程序将从该表中读取数据并插入到其他表中。

如果这是真的,那么我希望date 已经成为java.sql.Date(或null),您可以直接使用它:

ps.setDate(3, date);

如果date真的不是java.sql.Date,那么可以使用条件运算符:

ps.setDate(3, date == null ? null : new java.sql.Date(date.getTime()));

可以将null 传递给setDate(与setString 相同的原因)。仅当与列一起使用的 Java 类型是原始类型(如 int)时,才需要 setNull。由于您不能用null 调用setInt,而int 应该在哪里,所以在这种情况下您可以使用setNull。不过,这对 setDate 来说不是问题。

【讨论】:

    猜你喜欢
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 2013-10-19
    相关资源
    最近更新 更多