在日期字段上进行时间范围搜索的休眠条件

Posted

技术标签:

【中文标题】在日期字段上进行时间范围搜索的休眠条件【英文标题】:hibernate criteria for a time range search on a Date field 【发布时间】:2012-01-31 23:01:07 【问题描述】:

我正在使用 Oracle 10g、Hibernate 3、springMVC、jqgrid。 我在 ORACLE 中有一些 Date 字段,映射如下 p>

@Temporal(TemporalType.DATE)
@Column(name = "DOC_CREATION_DATE", length = 7,insertable=true,updatable=false)
public Date getDocCreationDate() 
    return this.docCreationDate;

在我的网格中,我使用 jqueryCalendar 过滤日期,一切都很好。 现在我有一个来自客户的新请求,即显示 documentCreation 的时间,他们也希望能够按时间过滤范围。例如:

查找在早上 6 点到晚上 7 点之间创建的所有记录,查找在早上 6 点创建的所有记录。

我已经尝试过格式化日期字段

@Temporal(TemporalType.TIMESTAMP)

这不是他们想要的

是否有任何其他方法可以解决这个问题,非常欢迎任何好的想法如何实现。

问题是我需要使用相同的 映射字段 在 Jqgrid 的一列中查询常规日期(12/01/2012 使用 jqueryCalendar)和为同一映射字段的时间部分添加另一列一旦完成,我需要查询(休眠条件)时间列时间范围 类似这样的模拟:

...
 criteria.add(Restrictions.ge("docCreationDate.mappedFieldTimePart",6AM ));

感谢大家的帮助

【问题讨论】:

这不是他们想要的吗?如果他们想存储时间,那就是他们想要的。使用 TemporalType.DATE 将只存储日期部分。不存储就无法搜索时间。 @Jesse 也检查一下***.com/a/4013601/706695,这里是您可以使用的参数; techonthenet.com/oracle/functions/to_date.php。但正如 JB Nizet 所说,如果你不存储它,你就没有机会按时间过滤。 当我格式化日期并将映射更改为**TIMESTAMP时,**我也能够检索整个时间,所以时间在这里没有问题,我只需要在那里提取它并使用它通过 CreationTime 进行查询谢谢大家 @JBNizet HRgiger 感谢你们对 TemporalType.Date 的看法是正确的。我能够得到时间的唯一原因是因为该特定字段有一个带有时间戳的审计触发器,所有其他人都有 00:00:00 :O 【参考方案1】:

该列是映射到时间的类型,因此您必须将其值与时间进行比较:

Time sixAM = Time.valueOf("06:00:00");
criteria.add(Restrictions.ge("docCreationDate.mappedFieldTimePart", sixAM));

您也可以使用常规日期:

Date sixAM = new SimpleDateFormat("HH:mm").parse("06:00");
criteria.add(Restrictions.ge("docCreationDate.mappedFieldTimePart", sixAM));

【讨论】:

谢谢,我现在正在做一个不同的项目,但这绝对是解决方案的一部分【参考方案2】:

您必须将@Temporal 注释更改为使用TemporalType.TIMESTAMP 或添加另一个字段并使用TemporalType.TIME 对其进行注释。 Hibernate 使用@Temporal 批注来确定该字段是否被视为java.sql.Timestampjava.util.Date,时间已终止(设置为午夜,或00h 00m 00.0s)。这允许开发人员在其应用程序的任何地方使用java.util.Date,而不必担心 Timestamp 类(它已从我们的大部分代码库中删除)。

【讨论】:

谢谢马特,这就是我现在正在做的创建额外的虚拟字段,用 TemporalType.TIME 注释,现在的问题是如何制定标准查询我从未按 TIME 过滤任何建议 不知道如何使用 Criteria 执行此操作,但使用 HQL 会非常简单,因为 HQL 具有可用的 hour() minute() second() 函数。 谢谢你,我现在正在做一个不同的项目,但这绝对是解决方案的一部分

以上是关于在日期字段上进行时间范围搜索的休眠条件的主要内容,如果未能解决你的问题,请参考以下文章

使用 Jquery Datepicker 进行 PHP MYSQL 日期范围搜索

休眠条件中日期的限制

在multiValued字段中搜索日期范围内的日期

element日期选择器根据不同状态展示对应时间范围的搜索条件

日期时间日历:在单个输入字段中选择日期范围

在 MySQL 中的日期字段上放置索引