【问题标题】:Performing Date/Time Math In HQL?在 HQL 中执行日期/时间数学?
【发布时间】:2010-10-12 23:26:10
【问题描述】:

我正在研究如何在 HQL 查询中执行日期/时间数学运算。具体来说,如何从 current_timestamp() 函数的结果中添加或减去 (x) 时间量?还是我必须为此投入 SQL 并希望正在运行的任何数据库都支持它?

HQL 查询示例:

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

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

澄清:我意识到这可以在查询之外轻松完成。但是出于哲学原因,假设使用数据库服务器的时间而不是查询系统的时间很重要。实际示例:我正在查询在最后 (x) 时间内创建的所有条目的自动时间戳。由于时间戳是由数据库系统生成的,因此也要使用数据库的当前时间。

【问题讨论】:

  • 我也在找同样的东西,只是timeToAdd不是参数,而是同一行的列,所以对同一行进行第二次查询没有意义和桌子。

标签: hibernate datetime hql


【解决方案1】:

为什么需要在查询中这样做?为什么不直接在java代码中处理呢。

例如:

From RandomThing
Where randomTime is not null and
      randomTime >= :currentTimestamp and
      randomTime <= :maxTimestamp

然后只需设置参数。

【讨论】:

  • 好答案。我在回复中澄清了这个问题。
  • 因为Java代码可能不会运行在同一个时钟上,而且在某些查询中,即使是几秒的差异也可能会造成麻烦。
【解决方案2】:

您可以使用数据库中的 SQL 确定执行此操作的语法,然后在自定义 HibernateDialect 中定义一个函数。例如,我们需要一个非标准 SQL 的工作日函数。我们对每个数据库的方言进行子类化,然后添加如下一行:

registerFunction("weekday", 
  new SQLFunctionTemplate(Hibernate.INTEGER, "to_char(?1,'D')") );

在您的情况下,您可以使用一个名为 date_diff 的函数,它可能被定义为 ? - ?在某些数据库中或在其他数据库中不同。这样您就不必在查询中编写原始 SQL,而且如果您需要切换数据库,只需在您的方言中以不同方式映射函数即可。

【讨论】:

    【解决方案3】:

    如果你需要数据库服务器的时间,你可以先做一个简单的 hql 查询来获取时间戳,然后在 java 中计算 maxTimestamp 并将获取的时间戳和计算的 maxTimeStamp 传递给像 ccclark 这样的查询。

    【讨论】:

    • 我认为这是最通用和易于实现的解决方案。谢谢。
    【解决方案4】:

    必须是 HQL 吗?我可能会切换到休眠标准并使用:

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

    【讨论】:

    • 将这两个语句放入标准与 HQL 查询有什么区别?
    • 此解决方案可与 CriteriaQuery API 一起使用,如果已经采用该方法,这将非常有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-19
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 2021-01-27
    • 2018-09-09
    • 2011-11-17
    相关资源
    最近更新 更多