在HQL中执行date/时间math?

我正在寻找如何在HQL查询中执行date/时间math。 具体来说,如何从current_timestamp()函数的结果中增加或减去(x)时间量? 或者我不得不放弃到SQL这个,并希望无论数据库正在运行支持它?

HQL查询示例:

 FROM RandomThing WHERE randomTime IS NOT NULL AND randomTime >= current_timestamp() AND randomTime <= (current_timestamp() + :timeToAdd) 

我可以定义:timeToSubtract参数是任何特定的单位,虽然任何大于小时的将是不可取的,秒是最可取的。

澄清:我意识到这可以很容易地在查询之外完成。 但是出于哲学上的原因,让我们说使用数据库服务器的时间,而不是查询系统的时间是很重要的。 实际的例子:我正在查询在最后(x)时间内所做的所有条目的自动时间戳。 由于时间戳是由数据库系统创build的,所以同样要使用数据库的当前时间。

如果您需要数据库服务器的时间,您可以首先执行一个简单的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? 我可能会切换到hibernate条件,并使用:

 Criteria.add( Restrictions.SQLRestriction( "{alias} <= current_timestamp() " ) ) Criteria.add( Restrictions.SQLRestriction( "{alias} >= (current_timestamp() + ?) ", 5 )