代码之家  ›  专栏  ›  技术社区  ›  Thomas Lötzer

使用hql查询日期,而忽略Oracle上的时间

  •  15
  • Thomas Lötzer  · 技术社区  · 16 年前

    我有一个表(在Oracle9和更高版本中),在该表中,我需要使用hibernate查找给定日期的所有条目。条目具有时间戳(数据类型为“日期”)。有些条目有时间,其他条目只有日期。这是不可更改的,因为这是我无法更改的其他应用程序的输出。在SQL中,我将沿着

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

    获取我要查找的日期的所有条目。我想知道如何让Hibernate使用HQL来完成这个任务。我知道我可以在Hibernate中使用SQL查询,但这似乎不太干净。有办法吗?如果可能的话,这种方法也应该适用于非Oracle数据库,其中时间戳是数据类型。

    4 回复  |  直到 8 年前
        1
  •  14
  •   Mihriban Minaz Andy Davies    8 年前

    您可以在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 总是包容性的,这意味着两者都有 >= <= 分别。
    更多细节 之间 在这里: http://www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

        2
  •  2
  •   Maarten Winkels    16 年前

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

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

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

        <class name="Person">
          <property name="birthDay" formula="trim(birthDay)"/>
        </class>

    现在可以使用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
  •  2
  •   SourceVisor    10 年前

    为了 定制QQL ,您可以尝试 躯干 关键字

    对于EX:

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

    注: 在哪里? :LastLoginDate 是一个参数。

    这对我有好处。

        4
  •  -1
  •   sra Jon    13 年前

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

    如: select * from emp where trunc(emp_date) < trunc(current_date()-30)

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