Können Envers im Ruhezustand die neueste Version aller Entitäten eines bestimmten Typs zurückgeben?

Ich habe ein großes Problem beim Versuch, Envers dazu zu bringen, die von mir benötigte Abfrage auszuführen. Wenn jemand mich wissen lassen kann, ob dies in Envers möglich ist oder ob ich die SQL direkt ausführen muss, wäre das eine enorme Hilfe!

Hier liegt das Problem. Ich habe eine erfundene "Projekt" -Entität, die von jeder Entitätsklasse geprüft wird. Ich versuche, die neueste Version von JEDER Projektentität über eine AuditReader-Abfrage abzurufen.

Wenn ich das mache (die anderen Teile des Codes sollten keine Rolle spielen):

AggregatedAuditExpression maxExpression = AuditEntity.revisionNumber().maximize();
maxExpression.add(AuditEntity.id().eq("12345"));
query.add(maxExpression);

und aktivieren Sie die SQL-Ausgabe, ich sehe diese Abfrage generiert:

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

Beachten Sie den Teil "Select Max". Es ist fast genau das, was ich brauche. Nur die where-Klausel ist falsch. Ich muss sagen: where project_a2_.id = project_a0_.id

Ich habe es von Hand bearbeitet, ausgeführt und es funktioniert einwandfrei. Jetzt scheint es, als würde die Methode "addIdsEqualToQuery" in der IdMapper-Klasse mich tun lassen, was ich will. Also, wenn ich die AuditEntity.id (). Eq ("12345") mit diesem ändere:

maxExpression.add(new IdentifierIdsEqAuditExpression());

Dabei ist IdentifierIdsEqAuditExpression gleich:

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

es sollte nah sein - es ist. Ich bekomme:

Ungültiger Pfad: 'originalId.id' [Wählen Sie e__, r aus com.mycompany.Project_AUD e_ aus., com.mycompany.audit.AuditRevisionEntity r wobei id = originalId.id und e_.originalId.REV.id = (Wählen Sie max (_e0.originalId.REV.id) aus com.mycompany.Project_AUDe0 wobei id = originalId.id) und e_.originalId.REV.id = r.id order by e__.originalId.REV.id asc]

Das Problem ist, dass ich es nicht dazu bringen kann, das zu generieren, was ich brauche, und selbst wenn das Präfix von "originalId" auf das richtige geändert wurde, warum fangen Envers an, das überall und nicht an einem einzigen Ort abzulegen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage