【问题标题】:Using Hibernate query : colon gets treated as parameter / escaping colon使用 Hibernate 查询:冒号被视为参数/转义冒号
【发布时间】: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 将其标记为无效。
  • 抱歉,您不能使用 SQL 代替 HQL。您提供了一个 SQL 查询。请参阅docs.jboss.org/hibernate/core/3.3/reference/en/html/… 并尝试使用有效的 HQL 编写您的查询。或者使用原生查询。
  • @James : createSQLQuery 不是用于原生查询吗?我试过了,但现在出现了一些不同的错误:Not all named parameters have been set: [:date]

标签: java hibernate spring postgresql hql


【解决方案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

【讨论】:

【解决方案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

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 2015-08-21
      • 2015-11-11
      • 2011-05-09
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      相关资源
      最近更新 更多