2010-11-29 94 views
0

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

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 

我怎么投的值,因此它是正确的类型日期,而不是整数的?

感谢您的帮助。

回答

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格式提供,如上所示。注意关键字日期指定的ANSI日期文字

+0

非常感谢。我用yyyy-MM-dd。 – sass 2010-11-29 20:14:28

1

我建议使用您的查询参数,让Postgres的驾驶员处理从字符串转换为相应的类型/逃避你 - 这就是为什么参数化查询存在。