JPA时间戳比较不起作用

Posted

技术标签:

【中文标题】JPA时间戳比较不起作用【英文标题】:JPA timestamp comparison not working 【发布时间】:2013-05-15 13:55:50 【问题描述】:

我有一个带有两个 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 有什么用?

【问题讨论】:

可以设置hibernate属性-show_sqltrue,查看hibernate生成的查询。 您应该将其作为实际答案发布并接受,而不是用答案编辑您的问题。这样,问题将被标记为已回答,实际上是已回答。 【参考方案1】:

你没有设置任何参数,查询必须得到一个命名参数:

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

我添加一个链接以强制执行主题here。

检查它是否有效:-)

【讨论】:

我认为不需要参数,expirationTime 是持久对象的成员。检查链接。

以上是关于JPA时间戳比较不起作用的主要内容,如果未能解决你的问题,请参考以下文章

JPA/Hibernate 级联删除不起作用

JPA 2.1 在 Eclipse 开普勒中不起作用

JPA EntityManager 查找方法不起作用[关闭]

我不知道为啥我非常简单的 JPA 项目不起作用

一对多映射不起作用Spring数据JPA

多行的spring数据jpa更新不起作用