Preparedstatement日期检查为空

时间:2014-02-17 17:51:37

标签: java postgresql date jdbc

我需要像这样进行查询

SELECT * FROM tanks WHERE (creationDate >= ? or ? is null) and (creationDate >= ? or ? is null)

然后我设置了

stmt.setObject(1, fromDate);
stmt.setObject(2, fromDate);
stmt.setObject(3, toDate);
stmt.setObject(4, toDate);

但我无法执行查询因为我有一个例外,Java无法确定参数$ 2的类型(对不起,我不知道为什么,但所有例外都是俄语)。

当我摆脱?是null 一切正常。

有人有想法如何处理吗?

2 个答案:

答案 0 :(得分:0)

您的查询应该是

SELECT * FROM tanks WHERE (creationDate >= ? or creationDate is null) and (creationDate >= ? or creationDate is null)

你应该只设置两个参数对应两个?

不确定任何允许你使用“?is Null”的东西,但你可以用另类方式做到这一点:

 if(fromDate!=null && toDate!=null){
      statement = connection.prepareStatement("SELECT * FROM tanks WHERE creationDate >= ? and creationDate >= ?");
      statement.setDate(1,fromDate);
      statement.setDate(2,toDate);

      ResultSet rs = statement.executeQuery();
 } else if(fromDate==null && toDate==null) {
      statement = connection.prepareStatement("SELECT * FROM tanks");
      ResultSet rs = statement.executeQuery();
 } else {
      statement = connection.prepareStatement("SELECT * FROM tanks WHERE creationDate >= ? ");
      statement.setDate(1,fromDate!=null?fromDate:toDate);

      ResultSet rs = statement.executeQuery();
 } 

希望这有帮助。

答案 1 :(得分:0)

基于this thread,这似乎是协议版本3引入的PostgreSQL JDBC驱动程序错误。

thred中建议的解决方法是降低协议

jdbc:postgresql://host:port/database?protocolVersion=2

或显式转换参数

SELECT ?::timestamp IS NULL
SELECT CAST(? AS timestamp) IS NULL

我遇到了同样的问题,并且能够使用显式转换来解决它。