Hibernate postgresql сравнение даты - PullRequest
0 голосов
/ 29 ноября 2010

Я использую базу данных Hibernate и PostgreSQL 8.4 в приложении Java.У меня есть следующий запрос:

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

Как преобразовать значение, чтобы оно имело правильный тип Дата, а не целое число?

Спасибо за помощь.

Ответы [ 2 ]

5 голосов
/ 29 ноября 2010

Если getDate () возвращает строку, вам нужно поместить ее в одинарные кавычки.Вы отправляете что-то вроде этого:

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

1 голос
/ 30 ноября 2010

Я бы предложил использовать параметры в вашем запросе и позволить драйверу postgres обрабатывать преобразование из Strings в соответствующие типы / для вас - именно поэтому существуют параметризованные запросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...