使用 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 查询:冒号被视为参数/转义冒号的主要内容,如果未能解决你的问题,请参考以下文章
转: 在hibernate中查询使用list,map定制返回类型