【发布时间】:2012-09-13 08:08:26
【问题描述】:
我目前无法使用 HQL 执行此查询。
String queryString = "SELECT o FROM Orders o WHERE o.orderMade >= DATE_SUB(NOW(), INTERVAL :fetchTime HOUR)";
这将获取最后 ":fetchTime" 小时的最后订单。
问题是,如何使用 HQL 设置这个参数?
我试过了
.em.createQuery(queryString).setParameter("fetchTime", fetchTime).getResultList();
但它会导致休眠错误。
我也尝试使用“?”而是一个命名参数,但没有成功。
即使在查询字符串中写入一个数字并且没有设置任何参数,我仍然会收到此错误:
unexpected token: 6
我知道这是指我使用的数字 6,而不是 fetchTime。
我得到这个工作的唯一方法是将它用作 NativeQuery,但是这个返回一个分离对象的列表,我真的很想使用 NamedQuery。
感谢您的宝贵时间!
【问题讨论】:
-
'fetchTime' 的 Java 类型是什么?也不是所有的位置参数都像撇号一样包含在转义序列中。但是 SQL 语法要求该值不能被转义。有效的 SQL:DATE_SUB(NOW(), INTERVAL 1 HOUR) ... 无效的 SQL DATE_SUB(NOW(), INTERVAL '1' HOUR) ... 使用 fetchTime 作为 Java Long 类型自己构建 SQL 和:“DATE_SUB(NOW( ), INTERVAL " + Long.valueOf(fetchTime).toString() + " HOUR)" ... 但请确保此类数据经过验证/完整性检查/限制在允许的范围内(默认情况下 Long 类型将执行此操作) .
-
@Nambari 错误是:意外令牌::
-
@DarrylMiles 谢谢你的小费。我完全按照您所说的进行了尝试,使用 Long.valueOf(fetchTime).toString() 构建 SQL 字符串,但我得到了意外的令牌:6.. 但现在我想我更接近解决这个问题了。谢谢!
标签: java hibernate hql named-query