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 Newbie

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





      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 {   


              public void addToQuery(AuditConfiguration auditCfg, String entityName, QueryBuilder qb, Parameters parameters) {


                          .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?