Jpa 获取特定对象受影响的完整环境修订

Jpa 获取特定对象受影响的完整环境修订,jpa,hibernate-envers,Jpa,Hibernate Envers,版本数据的存储方式受版本影响的每个对象都会在\u AUD表中获得单独的记录。因此,当我搜索影响对象A的修订时,我将返回对象B的修订为3的条目,但如果对象A和/或C在修订3中也发生了更改,则不会返回这些条目,给人的印象是,B是该版本中唯一修改的对象。我要做的是,对于影响对象B的每个修订,返回受该修订影响的所有对象 something_AUD desired actual id|REV id|REV id|REV -------------

版本数据的存储方式受版本影响的每个对象都会在
\u AUD
表中获得单独的记录。因此,当我搜索影响对象
A
的修订时,我将返回对象
B
的修订为
3
的条目,但如果对象
A
和/或
C
在修订
3
中也发生了更改,则不会返回这些条目,给人的印象是,
B
是该版本中唯一修改的对象。我要做的是,对于影响对象
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 然后对每个结果运行以下查询:

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();
int rev_id=((修订数据)数据[1]).getId();
AuditQuery q=AuditReaderFactory.get(JPA.em()).createQuery()
.用于修改实体(类型、假、真)
.add(AuditEntity.revisionNumber().eq(rev_id));
List real_data=q.getResultList();
但这会导致
QuerySyntaxException

别名“r”的重复定义[从中选择e、r、r 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(:u p1)和e.originalId.REV.id=r.id order by e、 originalId.REV.id asc,e.originalId.REV.id asc]


我尝试了几种不同的方法,它们都导致了相同的“别名'r'的重复定义”。还有什么我可以试试的吗?

这是我到目前为止想到的。它不是最干净的解决方案,但它可以:

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);
}
AuditReader=AuditReaderFactory.get(entity.em());
AuditQuery=reader.createQuery()
.用于修改实体(类型、假、真)
.add(AuditEntity.id().eq(entity.id));
列出原始结果=query.getResultList();
List complete_results=new ArrayList(raw_results.size());
对于(对象[]数据:原始结果){
int rev_id=((修订数据)数据[1]).getId();
AuditQuery q=reader.createQuery()
.用于修改实体(类型、假、真)
.add(AuditEntity.revisionNumber().eq(rev_id));
List real_data=q.getResultList();
完成结果。添加全部(真实数据);
}

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

不确定您的意思是:“但是如果其他实体也受到这些修订的影响,则不会返回这些条目”。举个例子有助于理解您试图实现的目标和面临的问题。更新后添加:我认为您无法使用envers api实现这一点,当您试图在一个查询中从多个表进行查询时,您必须使用JPA:实体
B
是否与实体
a
C
有某种关联?
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);
}