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

2022-09-01 18:37:34
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 中使用此语法?

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

但是当我使用now()::d ate语句时,它是特定的postgreSQL语法,休眠破坏了一切。


答案 1

我只是遇到了这个问题,不得不使用演员阵容,所以我尝试了一些东西来使它工作。原来你逃脱了:在冬眠中\

但是,在java中,要开始打印,您必须使用.
因此,如果要在 SQL 休眠查询中放置一个,则必须将其编写如下:\\:\\:

如果你想在PostgreSQL中转换,比如在我的情况下,你必须这样做,例如:如果你想把一些字段转换成一个整数。field\\:\\:int


答案 2

由于你在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


推荐