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 つの場所ではなくあちこちに配置し始めるのはなぜですか?