【问题标题】:Using HQL to query on a date while ignoring the time on Oracle使用 HQL 查询日期而忽略 Oracle 上的时间
【发布时间】:2010-11-02 02:17:54
【问题描述】:

我有一个表(在 Oracle 9 及更高版本中),我需要在其中使用 Hibernate 查找给定日期的所有条目。条目具有时间戳(数据类型为“日期”)。有些条目有时间,有些只有日期。这是无法更改的,因为这是我无法更改的其他应用程序的输出。在 SQL 中,我会写一些类似于

SELECT * FROM table WHERE trim(table.date) = to_date('11.06.2009')

获取我正在寻找的日期的所有条目。我想知道如何让 Hibernate 使用 HQL 来做到这一点。我知道我可以在 Hibernate 中使用 SQL 查询,但这似乎不太干净。有没有办法做到这一点?如果可能,这种方式也应该适用于以时间戳为数据类型的非 Oracle 数据库。

【问题讨论】:

    标签: hibernate date timestamp hql


    【解决方案1】:

    您可以在 HQL 中设置两个约束条件,一个指定大于或等于您搜索的开始日期,另一个指定小于第二天。

    table.date >=11.06.2009 AND table.date < 11.07.2009
    

    HQL(以及 SQL)还允许:

    table.date between 11.06.2009 AND 11.07.2009
    

    请记住,between 始终具有包容性,这意味着它分别是 &gt;=&lt;=
    有关between 的更多详细信息,请点击此处:http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

    【讨论】:

      【解决方案2】:

      我认为有两种方法可以解决这个问题:

      1. 使用criteria 查询并添加SQLRestriction。该限制将采用“trim({alias}.date) = ?”的形式。这里的问题可能是将输入参数转换为 Oracle(或其他 DBMS)上的正确类型。您可以提供必要的(休眠)类型作为参数,但如果这是依赖于数据库的,它将被硬编码。

      2. 在你的休眠映射中使用formula。映射将是:

       

      您现在可以使用 Hibernate 的类型系统来与 java 对象进行比较,如下所示:

      s.createCriteria(Person.class)
       .add(Restrictions.eq("birthDay", new java.sql.Date(System.currentTimeMillis())))
       .list()
      

      这两种解决方案都会遇到的一个问题是trim 函数在数据库中可能不可用。对此的解决方案(例如,在 HSQLDB 上进行测试时)是在您的类路径测试中放置一个 import.sql(这将由 Hibernate 自动获取)并在那里创建一个过程或函数。您也可以在该文件中Alter table Person add column birthDay timestamp 以使生成的架构正常工作。

      【讨论】:

        【解决方案3】:

        对于CustomHQL,可以试试trunc关键字

        例如:

        SELECT T0.FirstName as FirstName ,T0.LastLoginDate as LastLoginDate  FROM User T0
        WHERE (trunc(T0.LastLoginDate) >= :LastLoginDate) ORDER BY T0.LastLoginDate 
        

        注意:其中:LastLoginDate 是一个参数。

        这对我有用。

        【讨论】:

          【解决方案4】:

          您可以使用 trunc() 函数删除 DATE 列中的时间部分。

          例如:select * from emp where trunc(emp_date) &lt; trunc(current_date()-30)

          获取 1 个月前受雇的所有员工详细信息

          【讨论】:

          • 使用常量值不是一个好主意,正如 Setori 所说,有些月份少于 30 天,而其他月份则为 31 天。
          猜你喜欢
          • 2013-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-22
          • 1970-01-01
          • 2017-12-07
          • 2011-10-15
          • 2021-07-24
          相关资源
          最近更新 更多