JPA查询当天无视时间

Gen*_*isa 10 jpa jpa-2.0

假设您有一个带有java.util.Date字段的类.也许是一个To do class或Event planner类.

@Temporal(TemporalType.TIMESTAMP)
private Date startTime;
Run Code Online (Sandbox Code Playgroud)

这将映射到MySQL中的datetime列.

当您想要准确了解此事件何时发生时,有一些用例."计划于2011年8月11日晚上8点举行什么活动?"

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

如果你的JPAQL是:

SELECT blah blah etc. WHERE ti.startTime = :d1
Run Code Online (Sandbox Code Playgroud)

并且参数是java.util.Date实例:

query.setParameter("d1", date, TemporalType.DATE);
Run Code Online (Sandbox Code Playgroud)

您的结果将受到日期和时间的限制.

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

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

你是怎么解决这个问题的?

小智 11

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

select s from S s where date(s.someDate) = :param
Run Code Online (Sandbox Code Playgroud)

我设置了以下参数:

query.setParameter("param", param, TemporalType.DATE);
Run Code Online (Sandbox Code Playgroud)

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

builder.equal(
 builder.function("date", Date.class, root.get(S_.someDate)), 
 param
);
Run Code Online (Sandbox Code Playgroud)

至少,使用MySql它可以工作.

我希望它可以提供帮助.


JB *_*zet 6

select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay
Run Code Online (Sandbox Code Playgroud)

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

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

  • 如果你在startTime上有一个索引,它必须非常高效.使用SQL函数提取日期部分需要函数的索引才能有效.请注意,介于两者之间:> =和<=而不是> =和<. (2认同)