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

时间:2011-09-19 18:55:14

标签: java hibernate spring postgresql 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();

收到错误:

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

如何在HQL中使用此语法?

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

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

6 个答案:

答案 0 :(得分:39)

我刚遇到这个问题,不得不使用强制转换,所以我尝试了一些东西让它工作。原来你逃脱:用\

进行休眠

但是,在java中,要打印\,您必须使用\将其转义。
因此,如果要在SQL hibernate查询中添加:,则必须将其写为:\\:

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

答案 1 :(得分:3)

由于你使用的是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();

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

答案 2 :(得分:3)

查看http://www.postgresql.org/docs/8.1/static/sql-createcast.html

尝试使用演员。对我而言,它就像一个魅力。

答案 3 :(得分:0)

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();

答案 4 :(得分:-1)

命名参数采用冒号':',如this这就是您要找的内容吗?

答案 5 :(得分:-1)

您使用:转义::。我想。

或尝试nativequery