3

所以我的问题是我需要找到特定类的所有最近删除的实体,即自特定时间戳以来已被删除的实体。具体来说,我想查找在过去一小时内删除的实体。

我所有的实体都有一个创建和更新的时间戳,我用监听器正确维护:

@NotNull
@Column(name = "updated")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime updated;

我还使用 Envers 并注释我的实体。

所以猜测一下,我的查询应该是这样开始的:

// Query for deleted bookings
AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Booking.class, false, true)

但我不知道该放什么来查找自日期时间以来已删除的预订。

4

2 回答 2

10

首先,获取一小时前的时间戳(以毫秒为单位):

long timestamp = (System.getCurrentTimeMillis()) - (60*60*1000);

然后你可以查询相对于时间戳:

AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Booking.class, false, true)
.add(AuditEntity.revisionProperty("timestamp").gt(timestamp)
.add(AuditEntity.revisionType().eq(RevisionType.DEL));

List<Object[]> results = query.getResultList();

获取修订数据。每个Object[]都有

  1. 修订元数据(DefaultRevisionEntity或您自己的类注释@RevisionEntity(CustomRevisionListener.class)
  2. 实体实例(Booking在这种情况下)
  3. ,我们知道在这种情况下RevisionType将永远存在DEL
于 2011-08-11T16:35:18.207 回答
3

我发现 Envers API 非常有限,有时不得不转而使用纯 JPA。但是,这不是其中一种情况,我相信您可以通过执行以下操作来实现您的用例:

AuditQuery query = reader.createQuery().forRevisionsOfEntity(classType, false, true)
        .add(AuditEntity.revisionType().eq(RevisionType.DEL))
        .addProjection(AuditEntity.property(ID).distinct())
        .add(AuditEntity.revisionNumber().gt(revisionNumber);

上面的示例使用了修订号,但您可以轻松地从您要查找的开始日期检索修订号。

于 2011-07-30T22:10:00.710 回答