【问题标题】:Envers: How to get a set of revisions and revision objects in one queryEnvers:如何在一个查询中获取一组修订和修订对象
【发布时间】:2015-03-17 15:56:39
【问题描述】:

我需要根据 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 的映射中。
  3. 迭代以比较对象属性(修订之间)以查找属性更改,因此我可以获得旧值和新值。

这会起作用,但是,我认为它执行了太多查询,因为我认为,每个 AuditReader.find() 操作都会对数据库执行至少 1 个查询。 如果我可以在一个查询中获取所有对象版本,那就太好了,比如 .getRevisionsWithObjects()。

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

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

任何建议都有帮助,谢谢

【问题讨论】:

  • 你有没有为此想出任何解决方案?

标签: hibernate-envers


【解决方案1】:

这是我查询单个实体的审计历史的方式。 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;

【讨论】:

    【解决方案2】:

    对于在此线程上绊倒的任何人,ENVERs 能够通过下面的第一个布尔值(注意“真”值)仅检索历史实体(不包括元数据)。

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

    【讨论】:

      猜你喜欢
      • 2013-05-24
      • 2017-12-05
      • 2019-05-30
      • 1970-01-01
      • 2011-07-03
      • 2020-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多