Может ли hibernate envers возвращать последнюю версию всех сущностей определенного типа?
У меня огромная проблема с попыткой заставить Envers выполнить запрос, который мне нужен. Если кто-нибудь может сообщить мне, возможно ли это изнутри Envers или мне нужно напрямую извиниться за SQL, это было бы огромной помощью!
Здесь проблема. У меня есть макияжПроект» сущность - любой класс сущности будет делать - это проверяется. Я пытаюсь получить последнюю версию сущности КАЖДОГО проекта с помощью запроса AuditReader.
Когда я делаю это (другие части кода не должныне имеет значения):
AggregatedAuditExpression maxExpression = AuditEntity.revisionNumber().maximize();
maxExpression.add(AuditEntity.id().eq("12345"));
query.add(maxExpression);
и включить вывод SQL, я вижу этот запрос генерируется:
Hibernate: select project_a0_.id as id6_0_, project_a0_.REV as REV6_0_, auditrevis1_.id as id0_1_,
project_a0_.REVTYPE as REVTYPE6_0_, project_a0_.description as descript4_6_0_,
auditrevis1_.timestamp as timestamp0_1_, auditrevis1_.username as username0_1_
from MYSCHEMA.project_AUD project_a0_ cross join MYSCHEMA.REVINFO auditrevis1_
where project_a0_.REV=
(select max(project_a2_.REV) from MYSCHEMA.project_AUD project_a2_
where project_a2_.id=?)
and project_a0_.REV=auditrevis1_.id order by project_a0_.REV asc
Обратите внимание "выбрать макс часть. Это почти то, что мне нужно. Просто предложение where неверно, мне нужно сказать: где project_a2_.id = project_a0_.id
Я отредактировал его вручную, запустил, и он отлично работает. Теперь это выглядит как "addIdsEqualToQuery» метод в классе IdMapper позволяет мне делать то, что я хочу. Так что, если я изменю AuditEntity.id (). Eq ("12345") с этим:
maxExpression.add(new IdentifierIdsEqAuditExpression());
где IdentifierIdsEqAuditExpression равно:
class IdentifierIdsEqAuditExpression implements AuditCriterion {
@Override
public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {
auditCfg.getEntCfg().get(entityName).getIdMapper()
.addIdsEqualToQuery(parameters, null, auditCfg.getAuditEntCfg().getOriginalIdPropName());
}
}
это должно быть близко - это так. Я получил:
Неверный путь: 'originalId.id» [выберите e__, r из com.mycompany.Project_AUD e_, com.mycompany.audit.AuditRevisionEntity r, где id = originalId.id и e_.originalId.REV.id = (выберите максимум (_e0.originalId.REV.id) из com.mycompany.Project_AUDe0 где id = originalId.id) и e_.originalId.REV.id = r.id заказ по e__.originalId.REV.id asc]
Проблема в том, что я могучтобы получить то, что мне нужно, и даже если префикс был изменен с "originalId» к правильному, почему Энверс начинает размещать это повсюду, а не в одном месте?