Hibernate postgresql比较日期

sas*_*ass 0 java postgresql hibernate date

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

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

其中validStartDate是PostgreSQL数据库中的Date,getDate使用SimpleDateFormat从当前日期返回String.

但我一直收到一个错误:

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
Run Code Online (Sandbox Code Playgroud)

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

感谢帮助.

a_h*_*ame 5

如果getDate()返回一个String,那么你需要将它放入单引号中.你发送的是这样的东西:

SELECT ...
FROM ...
WHERE validStartDate < 2010-11-29

它被读作"列validStartDate低于计算2010年结果减去11减去29的结果"

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

编辑:如果要确保始终正确处理日期文字与任何客户端区域设置的关系,请使用正确的ANSI日期文字:

SELECT ...
FROM ...
WHERE validStartDate < DATE '2010-11-29'

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