假设您有一个带有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它可以工作.
我希望它可以提供帮助.
select ... where ti.startTime >= :theDay and ti.startTime < :theNextDay
Run Code Online (Sandbox Code Playgroud)
是一个相对简单的实现解决方案,适用于任何JPA实现.
Hibernate还允许向方言添加函数,以生成自定义SQL.
| 归档时间: |
|
| 查看次数: |
11900 次 |
| 最近记录: |