java - 以小时间隔命名的查询参数

标签 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();

但这会导致 hibernate 错误。

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

即使在查询字符串中写入数字并且不设置任何参数,我仍然收到此错误:

unexpected token: 6

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

我实现此功能的唯一方法是将其用作 NativeQuery,但是这个返回一个分离对象的列表,我真的想使用 NamedQuery。

感谢您的宝贵时间!

最佳答案

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 - 以小时间隔命名的查询参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12521431/

相关文章:

sql - SQL对Hql查询进行非常大的关联

java - Google Drive Api result.getStatus().isSuccess() 始终为真

java - 如何在maven项目中构建包含jar包的war

java - DDD : naming convention for Representation Layer and Domain Layer classes

Java:Hibernate 不导入文件

mysql - 带有 Select、Order 和 Desc 的 HQL 查询不起作用

Java - 如果我知道域,如何将相对 URL 字符串更改为绝对 URL?

java - spring + hibernate + c3p0 + ehcache java配置

java - Jboss 7.1.1 正确的 hibernate 依赖关系

java - Hibernate 使用注释将多表映射到一张表