Использование запроса Hibernate: двоеточие обрабатывается как параметр/экранирование двоеточия
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 видит двоеточие, он думает, что это параметр (: parameterName - синтаксис параметров в HQL), как вы можете видеть из моего 2 использует (:id and :days
).
Но когда я использую оператор now():: date, это специфический синтаксис postgreSQL, hibernate разрушает все.
Ответы
Ответ 1
Поскольку вы находитесь в 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
Ответ 2
У меня просто была эта проблема, мне пришлось использовать броски, поэтому я попробовал некоторые вещи, чтобы заставить ее работать. Оказывается, вы убегаете: в спящем режиме с \
Однако в java для печати \
для начала вам нужно сбежать с \
.
Итак, если вы хотите поставить :
в свой запрос hibernate SQL, вы должны записать его так: \\:
И если вы хотите включить в PostgreSQL, например, в моем случае, вам нужно будет, например: field\\:\\:int
, если вы хотите, чтобы какое-то поле было целое.
Ответ 3
Взгляните на http://www.postgresql.org/docs/8.1/static/sql-createcast.html
Попробуйте использовать бросок. Для меня это работало как прелесть.
Ответ 4
Вы бежите :
с помощью ::
. Я думаю.
Или попробуйте nativequery
Ответ 5
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();
Ответ 6
Именованные параметры берут двоеточие ':' like this Это то, что вы искали?