Получить полный Envers ревизии, где затрагивается конкретный объект - PullRequest
8 голосов
/ 04 августа 2011

Способ хранения данных редакции: каждый объект, на который влияет редакция, получает отдельную запись в таблице _AUD. Поэтому, когда я ищу ревизии, затрагивающие объект A, я получу запись, где ревизия равна 3 для объекта B, но если объекты 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

Я пытался сделать это, выполнив начальный запрос, чтобы найти соответствующие ревизии:

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' [выберите e, r, r из 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 в (: _p1) и e.originalId.REV.id = r.id упорядочить по e.originalId.REV.id asc, e.originalId.REV.id asc]

Я пробовал несколько вариантов этого, которые привели к одному и тому же «Дублирующему определению псевдонима« r »». Могу ли я попробовать что-нибудь еще?

1 Ответ

0 голосов
/ 12 августа 2011

Это то, что я придумал до сих пор.Это не самое чистое решение, но оно работает:

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

Надеюсь, кто-то найдет лучший способ, особенно тот, который может сделать это в одном запросе.

...