0 Replies Latest reply on Nov 23, 2012 10:42 AM by blackduck.joe

    Possible to get the latest revision for all entities of a given class?

    blackduck.joe

      I am having a huge problem trying to get Envers to execute the query I need. If anyone can let me know if this is possible from within Envers or if I need to excute the SQL directly that would be a tremendous help!

       

       

      Here is the problem. I have a made-up "Project" entity - any Entity class will do - that is audited. I am trying to get the latest revision of EVERY Project entity via an AuditReader query.

       

       

      When I do this (the other parts of the code shouldn't matter):

       

       

      AggregatedAuditExpression maxExpression = AuditEntity.revisionNumber().maximize();

      maxExpression.add(AuditEntity.id().eq("12345"));

      query.add(maxExpression);

       

       

      and turn on the SQL output, I see this query being generated:

       

       

      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

       

      Note the "select max" part. It is almost exactly what I need. Just the where clause is wrong I need it to say: where project_a2_.id=project_a0_.id

       

       

      I edited it by hand, ran it and it works perfectly. Now it SEEMS like the "addIdsEqualToQuery" method in the IdMapper class lets me do what I want. So if I change out the AuditEntity.id().eq("12345") with this:

       

           maxExpression.add(new IdentifierIdsEqAuditExpression());

       

      where IdentifierIdsEqAuditExpression equals:

       

       

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

              }   

          }

       

      it should be close - it is. I get:

       

       

      Invalid path: 'originalId.id' [select e__, r from com.mycompany.Project_AUD e_, com.mycompany.audit.AuditRevisionEntity r where id = originalId.id and e_.originalId.REV.id = (select max(_e0.originalId.REV.id) from com.mycompany.Project_AUD e0 where id = originalId.id) and e_.originalId.REV.id = r.id order by e__.originalId.REV.id asc]

       

       

      The problem is I can't get it to generate what I need and even if the prefix was changed from "originalId" to the correct one, why does envers start putting that all over the place, rather than in the single location?