获取特定对象受影响的完整Envers修订版

时间:2011-08-04 17:45:07

标签: jpa hibernate-envers

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

something_AUD     desired     actual

id|REV            id|REV      id|REV
-------------     -------     ------
A|1               B|2         B|2
B|2               B|3         B|3
B|3               C|3
C|3

我一直在尝试通过运行初始查询来查找相关修订:

B

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

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

  

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

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

1 个答案:

答案 0 :(得分:0)

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

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

希望有人会提出一种更好的方法,特别是可以在一次查询中完成的方法。