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?

questionAnswers(1)

yourAnswerToTheQuestion