使用Hibernate查询:冒号被视为参数/转义冒号

Jaa*_*nus 23 java postgresql spring hibernate hql

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();
Run Code Online (Sandbox Code Playgroud)

得到错误:

org.hibernate.hql.ast.QuerySyntaxException: unexpected token: :
Run Code Online (Sandbox Code Playgroud)

如何在HQL中使用此语法?

基本上问题是我想在我的查询中使用冒号(:),但是当hibernate看到冒号时,它认为它是一个参数(:parameterName是HQL中参数的语法),正如你从我的2个用途中看到的那样(:id and :days).

但是当我使用now():: date语句时,它是特定的postgreSQL语法,hibernate破坏了一切.

小智 41

我刚遇到这个问题,不得不使用强制转换,所以我尝试了一些东西来使它工作.结果你逃脱:在休眠中\

但是,在java中,要打印\开始,你必须用它来逃避它\.
所以,如果你想:在你的SQL hibernate查询中加入一个,你必须写它:\\:

如果你想在PostgreSQL中进行转换,例如在我的情况下,你将不得不,例如:field\\:\\:int如果你想将一些字段转换为整数.

  • 它在hibernate` 4.3.11.Final`` sb.append("NULL \\:\\:DATE AS date,")中对我有用; (3认同)
  • 这对我来说对hibernate` 3.6.10`不起作用.我最终使用`cast(field as integer)`代替. (2认同)

atr*_*ain 4

既然你在 Postgres 上,我会完全改变 date() :

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();
Run Code Online (Sandbox Code Playgroud)

请参阅http://www.postgresql.org/docs/8.2/static/functions-datetime.html

  • 也许尝试使用 CAST 而不是 ::。请参阅http://stackoverflow.com/questions/4791325/how-do-i-write-hql-query-with-cast (4认同)