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

Posted

技术标签:

【中文标题】使用 Hibernate 查询:冒号被视为参数/转义冒号【英文标题】:Using Hibernate query : colon gets treated as parameter / escaping colon 【发布时间】:2011-11-20 12:16:15 【问题描述】:
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 中使用这种语法?

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

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

【问题讨论】:

你想达到什么目的?投? No .. 只是想使用我的 SQL 查询,但 Hibernate 将其标记为无效。 复制:***.com/q/2794972/106261 抱歉,您不能使用 SQL 代替 HQL。您提供了一个 SQL 查询。请参阅docs.jboss.org/hibernate/core/3.3/reference/en/html/… 并尝试使用有效的 HQL 编写您的查询。或者使用原生查询。 @James : createSQLQuery 不是用于原生查询吗?我试过了,但现在出现了一些不同的错误:Not all named parameters have been set: [:date] 【参考方案1】:

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

但是,在 java 中,要打印 \ 开始,您必须使用 \ 对其进行转义。 所以,如果你想在你的 SQL hibernate 查询中放一个:,你必须这样写:\\:

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

【讨论】:

这对我来说不适用于休眠 3.6.10。我最终改用cast(field as integer) 它在休眠 4.3.11.Final sb.append(" NULL\\:\\:DATE AS date, "); 上对我有用 version: '5.0.12.Final' 也为我工作【参考方案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

【讨论】:

也许可以尝试使用 CAST 而不是 ::。见***.com/questions/4791325/…【参考方案3】:

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

尝试使用演员表。对我来说,它就像一种魅力。

【讨论】:

【参考方案4】:
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();

【讨论】:

对我来说看起来不错,但请添加一些 cmets 以了解问题所在:) SQL ANSI 不使用双冒号描述强制转换。要解决这个问题,请改用 cast 函数。【参考方案5】:

命名参数采用冒号“:”,例如 this 这就是您要找的吗?

【讨论】:

不...这实际上是问题所在。我只是想在查询中使用冒号,但 hibernate 认为它们是参数。【参考方案6】:

你用:: 逃脱:。我想。

或者试试nativequery

【讨论】:

以上是关于使用 Hibernate 查询:冒号被视为参数/转义冒号的主要内容,如果未能解决你的问题,请参考以下文章

参数化查询

冒号是不是需要在 URI 查询参数中进行编码?

转: 在hibernate中查询使用list,map定制返回类型

从包含冒号 (:) 的查询参数名称中读取值

转: Hibernate HQL查询 插入 更新(update)实例

如何在hibernate和postgresql中读出名称中带有冒号(:)的列