Получите полные версии Envers, в которых затронут конкретный объект

Способ хранения данных ревизии Каждый объект, затронутый ревизией, получает отдельную запись в таблице _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 по возрастанию, e.originalId.REV.id по возрастанию]

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


person Brad Mace    schedule 04.08.2011    source источник
comment
Не уверен, что вы имеете в виду: но если другие объекты также были затронуты этими изменениями, эти записи не возвращаются. Пример поможет понять, чего вы пытаетесь достичь и с какими проблемами сталкиваетесь.   -  person Gonzalo Garcia Lasurtegui    schedule 05.08.2011
comment
Добавлено после обновления: я не думаю, что вы можете сделать это с помощью envers API, вам придется использовать JPA, поскольку вы пытаетесь выполнить запрос из нескольких таблиц в одном запросе: ezingsoft.com/?p=52   -  person Gonzalo Garcia Lasurtegui    schedule 05.08.2011
comment
Есть ли у объекта B какая-либо связь с объектами A и C?   -  person Naros    schedule 07.02.2017


Ответы (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);
}

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

person Brad Mace    schedule 11.08.2011