我需要像这样进行查询
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 一切正常。
有人有想法如何处理吗?
答案 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
我遇到了同样的问题,并且能够使用显式转换来解决它。