在准备好的语句中处理Oracle Date数据类型的空值的正确方法

时间:2019-05-12 17:26:39

标签: java oracle date null prepared-statement

我有一个包含20多个列的数据库,其中一些是具有空值的date / timestamp数据类型。

Java应用程序将从该表读取数据并将其插入其他表。准备语句用于框架插入查询。当插入记录时,在日期列(无论它为空)上都会得到“空指针异常” 。对于Varchar,当实际值为null时,它将自动设置为null。有什么方法可以像准备好的语句中的varchar一样自动处理具有空值的Date字段?

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);

1 个答案:

答案 0 :(得分:1)

当然,问题在于您试图在getTime上调用date,该电话可能是null

  

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

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

ps.setDate(3, date);

如果date确实不是java.sql.Date,则可以使用条件运算符:

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

可以将null传递到setDate中(出于与setString相同的原因)。仅当您要在列中使用的Java类型是原始类型(例如setNull)时,才需要int。由于您无法使用setInt所在的null来调用int,因此在这种情况下,请使用setNull。不过,setDate并不是问题。