【问题标题】:Named Query parameter in hour interval以小时为单位的命名查询参数
【发布时间】: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


【解决方案1】:

SQL 中的时间计算总是很困难,因为每个数据库(MySQL、Oracle 等)的时间函数都不同。我向您推荐的最简单的解决方案是在 Java 中进行时间计算,例如:

long fetchTime = ....;  /* fetch time in hours */
String queryString = "FROM Orders o WHERE o.orderMade >= :orderTime";
Query query = session.createQuery(queryString);
Timestamp orderTime = new Timestamp(System.currentTimeMillis() - fetchTime * 60L * 60L * 1000L);
query.setTimestamp("orderTime", orderTime);
@SuppressWarnings("unchecked")
List<Orders> orders = query.list();

备注:60L * 60L * 1000L 是一小时。不要忘记 L 来强制进行长时间计算。

然后您可以确定您的 HQL 将适用于每个数据库。

【讨论】:

  • 好吧,我正要开始考虑用java计算时间,欢迎你的回答。这是一个很好的建议,应该考虑。非常感谢@Johanna。
  • 记住这一点,System.currentTimeMillis() 可能返回与数据库中存储的时间戳不同的时间戳。
  • 好的答案,除了有点过时:java.sql.Timestamp 类已被 java.time.OffsetDateTime 类取代。示例:OffsetDateTime.now( ZoneOffset.UTC ).plusHours( 1 )
【解决方案2】:

看来你有两个选择,要么选择原生,要么使用标准

How to implement mysql date_sub() function in Hibernate 3.0

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多