【问题标题】:Hibernate postgresql comparing dateHibernate postgresql比较日期
【发布时间】:2010-11-29 20:06:11
【问题描述】:

我在 Java 应用程序中使用 Hibernate 和 PostgreSQL 8.4 数据库。我有以下查询:

Query q = session.createQuery("from User where validStartDate < "  + getDate() +" and validEndDate >" + getDate());

其中 validStartDate 是 PostgreSQL 数据库中的日期,getDate 使用 SimpleDateFormat 从当前日期返回一个字符串。

但我不断收到错误消息:

Caused by: org.postgresql.util.PSQLException: ERROR: operator does not exist: date < integer
        at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:1592)
        at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1327)
        at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350)
        at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254)
        at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
        at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
        at org.hibernate.loader.Loader.doQuery(Loader.java:674)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
        at org.hibernate.loader.Loader.doList(Loader.java:2220)
        ... 49 more
2010-11-29 20:42:19 org.hibernate.util.JDBCExceptionReporter logExceptions
WARNING: SQL Error: 0, SQLState: 42883
2010-11-29 20:42:19 org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: operator does not exist: date < integer

如何转换值,使其具有正确的 Date 类型而不是整数?

感谢您的帮助。

【问题讨论】:

    标签: java hibernate postgresql date


    【解决方案1】:

    如果 getDate() 返回一个字符串,那么您需要将它放在单引号中。您发送的内容如下:

    选择 ... 从 ... WHERE 有效开始日期

    读作“validStartDate列低于2010-11-29的计算结果”

    现在,如果您将 2010-11-29 放入单引号中,PostgreSQL 会将该字符串转换为日期,但这是否成功取决于您在 SimpleDateFormatter 中应用的格式

    编辑:如果您想确保无论任何客户端区域设置都始终正确处理日期文字,请使用正确的 ANSI 日期文字:

    选择 ... 从 ... WHERE validStartDate

    引号之间的实际文字必须以 ISO 格式提供,如上所示。注意关键字 DATE 指定 ANSI 日期文字

    【讨论】:

    • 非常感谢。我使用 yyyy-MM-dd。
    • 使用 DATE '2010-11-29' 语法仍然会更加健壮,并且 - 当您实际提供日期时 - 从性能的角度来看可能会更好.因为没有发生可能使任何索引的使用无效的隐式转换
    【解决方案2】:

    我建议在您的查询中使用参数,并让 postgres 驱动程序为您处理从字符串转换为适当的类型/转义 - 这就是存在参数化查询的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-21
      • 2016-06-22
      • 1970-01-01
      • 2016-12-12
      • 2013-10-28
      • 2012-02-28
      相关资源
      最近更新 更多