JPA时间戳比较不起作用

时间:2013-05-15 13:55:51

标签: java jpa hsqldb

我有一个持久对象,有两个Date字段,比如

@Temporal(TemporalType.TIMESTAMP)
private Date generated;

@Temporal(TemporalType.TIMESTAMP)
private Date expirationTime;

在对象构造上,expirationTime基于generated字段

进行初始化
this.expirationTime = new Date(generated.getTime() + ttlMillis);

现在我正在尝试使用JPA查询从数据库中删除所有过期的对象

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > t.expirationTime");
q.executeUpdate();

但是运行一个简单的测试

MyObject o = new MyObject(somePastDate, someTTL);
em.persist(o);
... create the query above
q.executeUpate();

表示没有删除任何行。关于我做错了什么的任何线索?我在HSQLDb上运行测试并使用Hibernate作为我的JPA提供程序。

修改:已解决,但我不确定为什么这个版本应该以不同的方式工作。

Query q = em.createQuery("delete from MyObject t where :now > t.expirationTime");
q.setParameter("now", new Date());
q.executeUpdate();

如果与其他字段的比较失败,CURRENT_TIMESTAMP的用途是什么?

1 个答案:

答案 0 :(得分:0)

您没有设置任何参数,查询必须获取命名参数:

Query q = em.createQuery("delete from MyObject t where CURRENT_TIMESTAMP > :expirationTime");
q.setParameter("expirationTime" , yourObject.getExpirationTime());//or your getter
q.executeUpdate();

我添加了一个链接来强制执行主题here

检查它是否有效: - )