Envers:如何在一个查询中获取一组修订和修订对象

时间:2015-01-19 15:31:29

标签: hibernate-envers

我需要根据Envers提供的日志信息生成报告(表格),以向用户显示对象的更改列表。像这样的东西(以用户实体为例):

Id | field        | old_value | new_value
1  | display_name | Boby77    | Boby
1  | display_name | Boby      | Bob
1  | age          | 21        | 22

我找到的方式如下:

  1. 获取对象类型和ID,并使用方法AuditReader.getResivions()。这是获取该对象的修订列表(仅限数字)。
  2. 遍历修订列表并通过调用AuditReader.find(User.class,1L,i)获取对象的旧版本,并将这些对象的所有对象放在名为revObjects的Map中。
  3. 迭代比较对象属性(在修订版之间)以查找属性更改,因此我可以获取旧值和新值。
  4. 这将有效,但是,我认为它做了太多查询,因为我认为,每个AuditReader.find()操作都将作为数据库的至少1个查询执行。 如果我可以在一个查询中获取所有对象版本,例如.getRevisionsWithObjects(),那将是非常好的。

    我查看了AuditQuery类,希望找到一些解决方案,并发现此类仅适用于修订的范围,我的意思是,所有支持的查询仅在给定的修订版上运行。

    有人知道如何在一个查询中获取一组修订和修订对象吗?

    任何建议都有帮助,谢谢

2 个答案:

答案 0 :(得分:0)

以下是我查询单个实体的审核历史记录的方法。 AuditHistory类是一个包装器,它将我的自定义RevisionEntity和被审计的实体集合在一起。

List<AuditHistory<T>> auditHistoryList = new ArrayList<AuditHistory<T>>();
AuditQuery auditQuery = getAuditReader().createQuery().forRevisionsOfEntity(getEntityClass(), false, false).add(AuditEntity.id().eq(entity.getId()));
for (Object queryResults: auditQuery.getResultList()) {
    auditHistoryList.add(new AuditHistory<T>((Object[])queryResults));
};
return auditHistoryList;

答案 1 :(得分:0)

对于任何绊倒此线程的人,ENVERs只能通过下面的第一个布尔值检索历史实体(没有元数据)(请注意&#34; true&#34;值)。

AuditQuery auditQuery = getAuditReader()
   .createQuery()
   .forRevisionsOfEntity(getEntityClass(), true, false)
   .add(AuditEntity.id().eq(entity.getId()));

 return auditQuery.getResultList();