题
我在寻找如何在HQL查询中执行日期/时间数学。具体来说,如何添加或从current_timestamp()
函数的结果减去(X)的时间?还是我拖放到SQL,这和希望任何数据库正在运行支持呢?
HQL查询的示例:
FROM RandomThing
WHERE randomTime IS NOT NULL AND
randomTime >= current_timestamp() AND
randomTime <= (current_timestamp() + :timeToAdd)
我可以定义:timeToSubtract参数为任何特定的单元,虽然任何比小时更大是不希望的,并且秒将是最期望的
。澄清:我明白,这可以在查询的外部容易地完成。但是,对于哲学的原因,我们说要使用的数据库服务器的时间,而不是查询系统的时间是很重要的。实例:我查询的时间过去(x)的额度内的所有条目自动时间戳。由于时间戳是由数据库系统进行,重要的是还使用数据库的当前时间。
解决方案
如果您需要的数据库服务器的时间,你可以先做一个简单的HQL查询来获取时间戳,然后在Java计算maxTimestamp,并通过所获取的时间戳和计算maxTimeStamp像ccclark的一个查询。
其他提示
为什么你需要做的是在查询?为什么不直接处理它在Java代码中。
例如:
From RandomThing
Where randomTime is not null and
randomTime >= :currentTimestamp and
randomTime <= :maxTimestamp
和然后只设置的参数。
您可以决定的语法做使用SQL在数据库中,然后定义自定义HibernateDialect内的功能。例如,我们需要一个工作日的函数,而不是标准的SQL。我们子类为每个数据库方言,然后加入这样的行:
registerFunction("weekday",
new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );
在你的情况,你可以使用一个名为date_diff可能被定义为功能? - ?在一些数据库或东西别人不一样。你不必这样写原始的SQL查询中,如果你在任何时候需要切换数据库,你只是在你的方言不同方式映射功能。
它是否必须HQL?我可能会切换到休眠标准和使用:
Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) )
Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )
不隶属于 StackOverflow