小时间隔内的命名查询参数

时间:2012-09-20 21:49:14

标签: java hibernate hql named-query

我目前无法使用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。

感谢您的时间!

2 个答案:

答案 0 :(得分: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将适用于每个数据库。

答案 1 :(得分:1)

您似乎有两个选择或者是原生或使用标准

How to implement mysql date_sub() function in Hibernate 3.0