Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在SqlData实现中为长类型属性传递空值?_Java_Spring_Oracle_Jdbc - Fatal编程技术网

Java 如何在SqlData实现中为长类型属性传递空值?

Java 如何在SqlData实现中为长类型属性传递空值?,java,spring,oracle,jdbc,Java,Spring,Oracle,Jdbc,我收到了大量类型为SqlData对象的原始数据,并试图使用创建的用户定义类型将其插入到Oracle中 该问题仅适用于具有一些长属性(为null)的记录。 我得到了这些记录的NullPointer异常,因为它试图在null对象上调用toString 有没有办法在SQLOutput流中为长列写入空值 我知道这可以通过更改为字符串类型来实现,但我不能触及PL/SQL函数,因为它在许多地方都有使用 public classMyClass extends MyBaseType implements SQL

我收到了大量类型为SqlData对象的原始数据,并试图使用创建的用户定义类型将其插入到Oracle中

该问题仅适用于具有一些长属性(为null)的记录。 我得到了这些记录的NullPointer异常,因为它试图在null对象上调用toString

有没有办法在SQLOutput流中为长列写入空值

我知道这可以通过更改为字符串类型来实现,但我不能触及PL/SQL函数,因为它在许多地方都有使用

public classMyClass extends MyBaseType implements SQLData {

public void writeSQL(SQLOutput stream) throws SQLException {

    stream.writeString(getSource());
    stream.writeTimestamp(getDtm());
    stream.writeString(getUniqueId());
    stream.writeString(getType());

    stream.writeLong(getResponseCode());
当getResponseCode为null时,最后一行导致NullPointer异常

知道如何在不将类型更改为字符串的情况下处理此问题吗

最后一个选择是

private void writeNullPossibleNumber(SQLOutput stream, Integer intValue) throws SQLException {

    if (intValue==null) {
        stream.writeBigDecimal(null);
    } else {
        stream.writeInt(intValue);            
    }
}
上述解决方案工作正常

参考:

感谢您提供的所有帮助

,因为您看到SQLOutput.writeLong等待原语很长,但您似乎试图提供很长的包装。当然,在这种情况下,null不能转换为任何原语


因此,如果您根本无法将空值写入DB,则可以在写长之前添加空值检查,或者更改整个逻辑。

您可以使用以下选项之一:

显式地将NULL用于NULL值使用if语句选择NULL或toString 如果值为null,则从插入中删除列 下面的帮助器类可能对您有用

public class DatabaseHelper {
private static final String CNULL = "NULL";

static public String fixValue(Object value) {
    if (value == null) {
        return CNULL;
    } else {
        return value.toString();
    }
}
}
由于自动取消装箱,您将获得NPE。您应该显式写入空值,请尝试以下操作:

if (getResponseCode() != null) stream.writeBigDecimal(new BigDecimal(getResponseCode()));
else stream.writeBigDecimal(null);

我得到以下错误代码[17059];未能转换为内部表示:;嵌套异常为java.sql.SQLException:无法转换为内部表示:确定。尝试此流。writeBigDecimalnull。因为任何数字都是以数字的形式填充到数据库中的,特别是对于Oracle,这将是空数字的一种解决方法。@ArtemBilan I修改了答案。我实际上并没有使用SQLOutput,我在javadoc中查找发送null的方法。不能将两种类型混合在一起-iftrue同一类型,else同一类型。我试过了。但原因是:java.sql.SQLException:无法转换为内部表示形式:在oracle.jdbc.oracore.OracleTypeNUMBER.toNUMBEROracleTypeNUMBER.java:268@RajeshBalan尝试只使用BigDecimal。我更新了我的答案。你是对的它需要原语类型。我想我只能适应这种情况,但问题是早期使用PreparedStatement setLong的实现调用它来设置空值。有些是id值,我不能在那个地方假设为0。很高兴知道。所以,加上我的名声-谢谢如果null检查指示空值,则可以通过指示如何操作来改进答案。幸运的是,OP用最终的解决方案更新了他的问题。这里的问题是,我需要触及服务器合同来支持这一点。正如我所说,早期的实现是使用PreparedStatement setLong调用,其中也允许null。有些值是id,这些值是null吗?我不能假设它是0,因为在我以前的实现中,它被设置为null