Czy funkcje hibernacji mogą zwracać najnowszą wersję wszystkich elementów określonego typu?
Mam ogromny problem z uruchomieniem Enversa, aby wykonać zapytanie, którego potrzebuję. Jeśli ktoś może mi powiedzieć, czy jest to możliwe z poziomu Enversa lub jeśli muszę bezpośrednio wyciszyć SQL, byłoby to ogromną pomocą!
Oto problem. Mam gotową jednostkę „Projekt” - każda klasa Jednostki zrobi - która jest kontrolowana. Próbuję uzyskać najnowszą wersję jednostki KAŻDEGO projektu za pomocą zapytania AuditReader.
Kiedy to zrobię (pozostałe części kodu nie powinny mieć znaczenia):
AggregatedAuditExpression maxExpression = AuditEntity.revisionNumber().maximize();
maxExpression.add(AuditEntity.id().eq("12345"));
query.add(maxExpression);
i włącz wyjście SQL, widzę, że to zapytanie jest generowane:
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
Zwróć uwagę na część „wybierz max”. To prawie dokładnie to, czego potrzebuję. Tylko klauzula where jest błędna Potrzebuję jej powiedzieć: gdzie project_a2_.id = project_a0_.id
Zmontowałem go ręcznie, uruchomiłem i działa idealnie. Teraz SZYBIE, jak metoda „addIdsEqualToQuery” w klasie IdMapper pozwala mi robić to, co chcę. Więc jeśli zmienię AuditEntity.id (). Eq ("12345"), to:
maxExpression.add(new IdentifierIdsEqAuditExpression());
gdzie IdentifierIdsEqAuditExpression równa się:
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());
}
}
powinno być blisko - to jest. Dostaję:
Nieprawidłowa ścieżka: „originalId.id” [wybierz e__, r z com.mycompany.Project_AUD e_, com.mycompany.audit.AuditRevisionEntity r gdzie id = originalId.id i e_.originalId.REV.id = (wybierz max (_e0.originalId.REV.id) z com.mycompany.Project_AUDe0 gdzie id = originalId.id) i e_.originalId.REV.id = r.id zamów przez e__.originalId.REV.id asc]
Problem polega na tym, że nie mogę go zmusić do wygenerowania tego, czego potrzebuję, a nawet jeśli prefiks został zmieniony z „originalId” na właściwy, dlaczego envers zaczyna go umieszczać w całym miejscu, a nie w pojedynczej lokalizacji?