使用Hibernate envers查找最近删除的实体

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)

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

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

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);

上面的例子使用了版本号,但你也可以从你要查找的开始日期中轻松地检索到版本号。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接