Подтвердить что ты не робот

Использование запроса 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 разрушает все.

4b9b3361

Ответ 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, если вы хотите, чтобы какое-то поле было целое.

Ответ 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 Это то, что вы искали?