2010-11-29 99 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的駕駛員處理從字符串轉換爲相應的類型/逃避你 - 這就是爲什麼參數化查詢存在。