16

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

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

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

4

4 回答 4

15

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

IE

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

HQL(以及 SQL)还允许:

table.date between 11.06.2009 AND 11.07.2009

请记住between始终是包容性的,这意味着它既是>=<=分别是。
更多细节在between这里: http: //www.coding-dude.com/wp/java/hibernate-java/hibernate-hql-between-expression/

于 2009-06-11T10:34:25.583 回答
2

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

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

  2. 在您的休眠映射中使用公式。映射将是:

    <类名="人">
      <property name="birthDay" 公式="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 在该文件中使生成的架构工作。

于 2009-06-11T17:35:59.813 回答
2

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

例如:

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

注意:参数在哪里:LastLoginDate

这对我有用。

于 2011-01-06T12:01:33.333 回答
-1

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

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

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

于 2009-11-11T11:24:32.927 回答