在postgres下将PreparedStatement参数设置为null的正确方法

时间:2011-05-26 04:03:08

标签: postgresql jdbc

使用JDBC4(通过JDK6)使用最新的JDBC4驱动程序连接到postgresql 9.0。

conn = dpaDs.getConnection();
PreparedStatement stmt = conn.prepareStatement("delete from fss where f_id=? and f_lastmodified=?");
UUID target = UUID.fromString("8c5c5ac2-3a2a-49f3-ae48-29226d6ea3e7");
stmt.setObject(1, target, 1111);
//non of these work
//stmt.setNull(2,93);
//stmt.setObject(2,null, 93);
//stmt.setObject(2,null, java.sql.Types.NULL);
//stmt.setNull(2, java.sql.Types.NULL);
int rowCount = stmt.executeUpdate();
int g = 8;

将第二个参数设置为null的正确方法是什么? 我知道我可以使用“哪里...... f_lastmodified为null”,但是没有办法解决这个问题吗?

3 个答案:

答案 0 :(得分:3)

那不行。

使用=运算符无法进行NULL比较。如果要测试NULL,则必须使用and f_lastmodified IS NULL

您不能在预准备语句中使用IS NULL条件的参数。

答案 1 :(得分:0)

如果您使用命名参数(例如:p而不是?)而不是位置参数,那么您可以执行以下操作,

((:p is null and f_lastmodified is null) or f_lastmodified = :p)

这有点尴尬,但它完成了工作。我没有尝试过jdbc,只有.net上的Npgsql,但我认为它应该是一样的。

答案 2 :(得分:0)

在postgres中,您可以使用is not distinct from,它实际上是一个空安全的相等性检查。

如果您更改要使用的查询与此并没有区别,则现在可以将null设置为参数2。

delete
  from fss
 where f_id = ?
   and f_lastmodified is not distinct from ?