【问题标题】:Preparedstatement date check is nullPreparedstatement 日期检查为空
【发布时间】:2014-02-17 17:51:37
【问题描述】:

我需要这样查询

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 一切正常。

有人知道如何处理它吗?

【问题讨论】:

  • 你所说的“所有例外都是俄语”是什么意思?
  • 不确定postgresql,但在某些数据库服务器中,您可以将参数强制转换为显式类型(例如CAST(? AS DATE) IS NULL
  • @Alexey Caused by: org.postgresql.util.PSQLException: ОШИБКА: не удалось определить тип данных параметра $4
  • .setObject 替换为.setDate 会发生什么?
  • 谢谢你@MarkRotteveel 它有效!

标签: java postgresql date jdbc


【解决方案1】:

您的查询应该是

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

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

不确定是否允许您使用“?为 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();
 } 

希望这会有所帮助。

【讨论】:

  • 不,不是。此查询使我能够将一些参数作为可选参数传递。
  • 您想使用 null 值的 fromDate 和 toDate 吗?
  • 是的,它会让我通过与否。
【解决方案2】:

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

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

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

或显式转换参数

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

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

【讨论】:

    猜你喜欢
    • 2012-05-10
    • 1970-01-01
    • 2011-01-25
    • 2018-10-02
    • 1970-01-01
    • 2019-10-13
    • 1970-01-01
    • 2015-06-27
    • 2012-04-18
    相关资源
    最近更新 更多