【问题标题】:Get complete Envers revisions where a particular object is affected获得影响特定对象的完整 Envers 修订版
【发布时间】:2011-10-20 05:45:23
【问题描述】:

修订数据的存储方式 每个受修订影响的对象都会在_AUD 表中获得单独的记录。因此,当我搜索影响对象A 的修订时,我将返回对象B 的修订为3 的条目,但如果对象A 和/或C 在修订3 中也发生了更改,这些条目不会返回,给人的印象是B 是该修订版中唯一修改的对象。我要做的是对于影响对象B 的每个修订版,返回受该修订版影响的所有对象。

something_AUD 期望 实际 id|REV id|REV id|REV ------------- -------- ------ A|1 B|2 B|2 B|2 B|3 B|3 B|3 C|3 C|3

我一直试图通过运行初始查询来查找相关修订来做到这一点:

AuditQuery query = AuditReaderFactory.get(entity.em()).createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.id().eq(entity.id));

然后为每个结果运行以下查询:

int rev_id = ((RevisionData) data[1]).getId();
AuditQuery q = AuditReaderFactory.get(JPA.em()).createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.revisionNumber().eq(rev_id));
List<Object[]> real_data = q.getResultList();

但这会导致QuerySyntaxException:

别名'r'的重复定义[select e, r, r from models.AgentShift_AUD e、models.RevisionData r、models.RevisionData r 其中 e.originalId.REV.id in (:_p0) 和 e.originalId.REV.id = r.id 和 e.originalId.REV.id in (:_p1) and e.originalId.REV.id = r.id order by e.originalId.REV.id asc, e.originalId.REV.id asc]

我已经尝试了几种变体,这些变体都导致了相同的“别名'r'的重复定义”。还有什么我可以尝试的吗?

【问题讨论】:

  • 不确定您的意思:“但如果其他实体也受到这些修订的影响,则不会返回这些条目”。一个示例将有助于了解您想要实现的目标以及您面临的问题。
  • 更新后添加:我认为您不能使用 envers api 做到这一点,您必须使用 JPA,因为您尝试在单个查询中从多个表中查询:@ 987654321@
  • 实体B是否与实体AC有某种关系关联?

标签: jpa hibernate-envers


【解决方案1】:

这是我到目前为止所想出的。它不是最干净的解决方案,但它有效:

AuditReader reader = AuditReaderFactory.get(entity.em());
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.id().eq(entity.id));

List<Object[]> raw_results = query.getResultList();
List<Object[]> complete_results = new ArrayList<Object[]>(raw_results.size());

for (Object[] data : raw_results) {
    int rev_id = ((RevisionData) data[1]).getId();
    AuditQuery q = reader.createQuery()
    .forRevisionsOfEntity(type, false, true)
    .add(AuditEntity.revisionNumber().eq(rev_id));
    List<Object[]> real_data = q.getResultList();
    complete_results.addAll(real_data);
}

希望有人会想出更好的方法,尤其是可以在单个查询中完成的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2015-03-17
    • 2013-04-12
    • 1970-01-01
    • 2017-12-05
    • 2018-04-16
    • 1970-01-01
    相关资源
    最近更新 更多