Использование запроса Hibernate: двоеточие рассматривается как параметр / экранирующий двоеточие - PullRequest
21 голосов
/ 19 сентября 2011
return sessionFactory.getCurrentSession().
            createQuery("FROM Weather WHERE city_id = :id AND date " +
                    "BETWEEN now()::date AND now()::date + (:days - 1)").
                    setInteger("id", city_id).setString("days", days).list();

получая ошибку:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: :

Как я могу использовать этот синтаксис в HQL?

В основном проблема в том, что я хочу использовать двоеточие (:) в своем запросе, но когда hibernate видит двоеточие, он думает, что это параметр (параметр: имя_параметра - синтаксис для параметров в HQL), как вы можетесм. из моих 2 использований (:id and :days).

Но когда я использую оператор now () :: date, это специфический синтаксис postgreSQL, hibernate разрушает все.

Ответы [ 6 ]

39 голосов
/ 15 августа 2012

У меня просто была эта проблема, пришлось использовать приведение, поэтому я попробовал кое-что сделать, чтобы это работало. Оказывается, вы убегаете: в спящем режиме с \

Однако в java для печати \ для начала вы должны экранировать его с помощью \.
Итак, если вы хотите поместить : в запрос SQL в режиме гибернации, вы должны написать его следующим образом: \\:

И если вы хотите привести в PostgreSQL, как, например, в моем случае, вам, например, придется: field\\:\\:int, если вы хотите привести какое-то поле к целому числу.

4 голосов
/ 19 сентября 2011

Поскольку вы находитесь на Postgres, я бы полностью изменил дату ():

return sessionFactory.getCurrentSession().
        createQuery("FROM Weather WHERE city_id = :id AND date " +
                "BETWEEN current_date AND (current_date + (integer :days - 1))").
                setInteger("id", city_id).setString("days", days).list();

См. http://www.postgresql.org/docs/8.2/static/functions-datetime.html

3 голосов
/ 14 марта 2014

Взгляните на http://www.postgresql.org/docs/8.1/static/sql-createcast.html

Попробуйте использовать приведение.Для меня это сработало как шарм.

0 голосов
/ 09 ноября 2017
return sessionFactory.getCurrentSession().
        createQuery("FROM Weather WHERE city_id = :id AND date " +
                "BETWEEN cast(now() as date) AND cast(now() as date) + (:days - 1)").
                setInteger("id", city_id).setString("days", days).list();
0 голосов
/ 19 сентября 2011

Вы убегаете : с ::.Я думаю.

Или попробуйте nativequery

0 голосов
/ 19 сентября 2011

Именованные параметры принимают двоеточие ':' как это Это то, что вы искали?

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