1

Envers に必要なクエリを実行させようとすると、大きな問題が発生します。Envers内からこれが可能かどうか、またはSQLを直接実行する必要があるかどうかを誰かに教えてもらえれば、非常に助かります!

これが問題です。私は作成された「プロジェクト」エンティティを持っています-どのエンティティクラスでも構いません-それは監査されています。AuditReader クエリを使用して、すべてのプロジェクト エンティティの最新リビジョンを取得しようとしています。

これを行うと(コードの他の部分は問題になりません):

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

SQL 出力をオンにすると、次のクエリが生成されていることがわかります。

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

「select max」部分に注意してください。それは私が必要としているものとほぼ同じです。where 句だけが間違っているので、次のように言う必要があります。

手で編集して実行したところ、完全に機能しました。IdMapper クラスの「addIdsEqualToQuery」メソッドを使用すると、やりたいことができるようになります。したがって、AuditEntity.id().eq("12345") を次のように変更すると:

maxExpression.add(new IdentifierIdsEqAuditExpression());

ここで、IdentifierIdsEqAuditExpression は次のようになります。

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

近いはずです-そうです。私は得る:

無効なパス: 'originalId.id' [com.mycompany.Project_AUD e_ 、com.mycompany.audit.AuditRevisionEntity r から e__、r を選択します。ここで、id = originalId.id および e _.originalId.REV.id = (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]

問題は、必要なものを生成することができず、プレフィックスが「originalId」から正しいものに変更されたとしても、envers がそれを 1 つの場所ではなくあちこちに配置し始めるのはなぜですか?

4

1 に答える 1

0

残念ながら、これは現在 Envers では不可能です。parentIdEqual() のようなものを maxExpression に追加する必要がありますが、そのようなコンビネータはありません。

機能リクエストを開いてください: https://hibernate.onjira.com/secure/Dashboard.jspa

originalId に関しては、Envers エンティティには、リビジョン番号と元の ID (originalId サブプロパティに保持されている) の複合 ID があります。

于 2012-11-24T20:34:56.943 に答える