JPA查询当天无视时间

时间:2011-08-27 18:28:50

标签: jpa jpa-2.0

假设您有一个带有java.util.Date字段的类。也许是一个待办班或活动策划班。

@Temporal(TemporalType.TIMESTAMP)
private Date startTime;

这将映射到MySQL中的日期时间列。

有些用例需要准确了解此事件何时发生。 “计划于2011年8月11日晚上8点举行什么活动?”

有时您只想知道特定日期的计划事件。 “计划于2011年8月11日举办什么活动?”

如果你的JPAQL是:

SELECT blah blah etc. WHERE ti.startTime = :d1

,参数是java.util.Date实例:

query.setParameter("d1", date, TemporalType.DATE);

您的结果将受到日期的限制,但 也是时间。

这是一个常见的用例,我很惊讶即使在JPA 2.0中也没有简单的方法可以做到这一点。

我宁愿不使用特定于供应商的黑客,也不要使用字符串/子串。

你是如何解决这个问题的?

2 个答案:

答案 0 :(得分:10)

我知道我有点晚了,但我找到了办法。 我正在使用这样的jpql:

select s from S s where date(s.someDate) = :param

我设置了参数:

query.setParameter("param", param, TemporalType.DATE);

我发现使用Criteria Query执行此操作的方式是:

builder.equal(
 builder.function("date", Date.class, root.get(S_.someDate)), 
 param
);

至少,使用MySql可以正常工作。

我希望它可以提供帮助。

答案 1 :(得分:6)

select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay

是一个相对简单的实现解决方案,适用于任何JPA实现。

Hibernate还允许向方言添加函数,以生成自定义SQL。