假设您有一个带有java.util.Date字段的类。可能是“待办事项”类(class)或“事件策划者”类(class)。
@Temporal(TemporalType.TIMESTAMP)
private Date startTime;
这将映射到MySQL中的datetime列。
在某些情况下,您想确切地知道此事件的发生时间。 “什么预定于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中,也没有简单的方法可以做到这一点。
我宁愿不使用供应商特有的技巧,也不喜欢使用字符串/子字符串。
您是如何解决这个问题的?
最佳答案
我知道我来晚了,但是我找到了一种方法。
我正在使用像这样的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可以。
希望对您有所帮助。
关于JPA查询忽略时间的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7216473/