Jdbc 编制报表和';空';WHERE子句中的值

Jdbc 编制报表和';空';WHERE子句中的值,jdbc,Jdbc,我正在使用PrepareStatement和BatchUpdate执行更新查询。在for循环中,我创建了一个批处理。在循环结束时,我执行批处理 如果PrepareStatement中使用的SQL查询在WHERE claues中没有空值,则上述逻辑可以正常工作 如果WHERE clasue中存在空值,Update语句将失败 我的代码看起来像这样 connection = getConnection(); PreparedStatement ps = connection.prepareState

我正在使用PrepareStatement和BatchUpdate执行更新查询。在for循环中,我创建了一个批处理。在循环结束时,我执行批处理

如果PrepareStatement中使用的SQL查询在WHERE claues中没有空值,则上述逻辑可以正常工作

如果WHERE clasue中存在空值,Update语句将失败

我的代码看起来像这样

connection = getConnection();

PreparedStatement ps = connection.prepareStatement(
        "UPDATE TEST_TABLE SET Col1 = true WHERE Col2 = ? AND Col3 = ?");

for (Data aa : InComingData){
    if(null == aa.getCol2()){
        ps.setNull(1, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(1,aa.getCol2())
    }

    if(null == aa.getCol3()) {
        ps.setNull(2, java.sql.Types.INTEGER);
    }
    else {
        ps.setInteger(2,aa.getCol3())

    }
    ps.addBatch();
}

ps.executeBatch();
connection.commit();    

任何帮助都将不胜感激。

这是因为在SQL中,
something=null
始终为false,即使
something
为null。要将列与null进行比较,必须使用
其中col2为null
,而不是
其中col2=null

,这是因为在SQL中,
something=null
始终为false,即使
something
为null。要将列与null进行比较,必须使用
其中col2为null
,而不是
其中col2=null
如果不希望动态生成SQL,可以在
where
子句中的所有可为null的列上使用
NVL
null
转换为该列永远不会包含的值;在
语句中设置绑定变量时,只需将
null
转换为
NVL
函数中使用的相同值。比如说,

String sql = "UPDATE TEST_TABLE SET Col1 = true
              WHERE NVL(Col2, -1) = ? AND NVL(Col3, -1) = ?";
语句中

ps.setInt(1, aa.getCol2() == null ? -1 : aa.getCol2().intValue());
ps.setInt(2, aa.getCol3() == null ? -1 : aa.getCol3().intValue());

如果不希望动态生成SQL,可以在
WHERE
子句中的所有可空列上使用
NVL
,将
null
转换为该列永远不会包含的值;在
语句中设置绑定变量时,只需将
null
转换为
NVL
函数中使用的相同值。比如说,

String sql = "UPDATE TEST_TABLE SET Col1 = true
              WHERE NVL(Col2, -1) = ? AND NVL(Col3, -1) = ?";
语句中

ps.setInt(1, aa.getCol2() == null ? -1 : aa.getCol2().intValue());
ps.setInt(2, aa.getCol3() == null ? -1 : aa.getCol3().intValue());

谢谢你的回复。但是我应该做些什么改变才能使它工作呢?好吧,根据参数的空值动态地构建SQL查询。谢谢您的响应。但是我应该做什么改变才能使它工作呢?好吧,根据参数的空值动态地构建SQL查询。