2

我目前无法使用 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();

但它会导致休眠错误。

我也尝试使用“?” 而是一个命名参数,但没有成功。

即使将数字写入 queryString 并且不设置任何参数,我仍然会收到此错误:

unexpected token: 6

我知道这是指我使用的数字 6,而不是 fetchTime。

我得到这个工作的唯一方法是将它用作 NativeQuery,但是这个返回一个分离对象的列表,我真的很想使用 NamedQuery。

感谢您的时间!

4

2 回答 2

4

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 将适用于每个数据库。

于 2012-09-21T06:58:36.047 回答
1

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

如何在 Hibernate 3.0 中实现 mysql date_sub() 函数

于 2012-09-21T11:53:59.093 回答