Java 在预处理语句中处理Oracle日期数据类型空值的正确方法

Java 在预处理语句中处理Oracle日期数据类型空值的正确方法,java,oracle,date,null,prepared-statement,Java,Oracle,Date,Null,Prepared Statement,我有一个超过20列的数据库,其中一些是带有空值的日期/时间戳数据类型 Java应用程序将从这个表中读取数据并插入到另一个表中。Prepared语句用于框架插入查询。当插入记录时,我在日期列上得到null指针异常,在该列中它为null。对于Varchar,当实际值为null时,它会自动设置为null。有没有办法像预处理语句中的varchar那样自动处理带有空值的日期字段 PreparedStatement ps = null; .... .... ps.setDate(3, new java.sq

我有一个超过20列的数据库,其中一些是带有空值的日期/时间戳数据类型

Java应用程序将从这个表中读取数据并插入到另一个表中。Prepared语句用于框架插入查询。当插入记录时,我在日期列上得到null指针异常,在该列中它为null。对于Varchar,当实际值为null时,它会自动设置为null。有没有办法像预处理语句中的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);

当然,问题是您试图在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。由于不能在int应该在的位置使用null调用setInt,因此在这种情况下,您应该使用setNull。但是,这对于setDate来说不是问题。

Java应用程序将从这个表中读取数据并插入到另一个表中。那么为什么需要创建一个新的java.sql.Date呢?date不是已经是java.sql.date或null了吗?我在date列上得到了null指针表达式-如果没有看到表的DDL,就不可能确定,但似乎您遇到问题的列上有一个NOT null约束,这意味着它们不能设置为null。请编辑您的问题,以包括表的DDL,包括所有列和约束,以及您得到的错误的确切文本。Thank.java.sql.Date以及java.sql.Date已过时。现在改用localdatefrom:ps.setObject3,yourLocalDate;。注:1使用setObject代替setDate。2当您的LocalDate也为null时,它会起作用。@T.J.Crowder源表的类型为Timestamp,目标表的数据类型为Date。它不需要任何时间段。@BobJarvis谢谢。源表和目标表上都没有不为null的约束。源的数据类型为Timestamp allowed null,目标表的数据类型为Dateallowed null。