假设您有一个带有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中也没有简单的方法可以做到这一点。
我宁愿不使用特定于供应商的黑客,也不要使用字符串/子串。
你是如何解决这个问题的?
答案 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。