8

リビジョン データが保存される方法は、リビジョンの影響を受ける各オブジェクトが_AUDテーブル内の個別のレコードを取得します。したがって、 object に影響を与えるリビジョンを検索するとA、リビジョンが3objectのエントリが返されますBが、オブジェクトAおよび/またはCリビジョン で変更された場合3、それらのエントリは返されず、B変更された唯一のオブジェクトであるという印象を与えますそのリビジョン。私がやろうとしているのは、オブジェクトに影響を与える各リビジョンに対してB、そのリビジョンの影響を受けるすべてのオブジェクトを返すことです。

something_AUD 希望の実際の

id|REV id|REV id|REV
------------- ---------- ------
A|1 B|2 B|2
B|2 B|3 B|3
B|3 C|3
C|3

関連するリビジョンを見つけるために最初のクエリを実行することで、これを実行しようとしています。

AuditQuery query = AuditReaderFactory.get(entity.em()).createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.id().eq(entity.id));

次に、結果ごとに次のクエリを実行します。

int rev_id = ((RevisionData) data[1]).getId();
AuditQuery q = AuditReaderFactory.get(JPA.em()).createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.revisionNumber().eq(rev_id));
List<Object[]> real_data = q.getResultList();

しかし、これは次の結果になりますQuerySyntaxException:

エイリアス 'r' の重複定義 [models.AgentShift_AUD e、models.RevisionData r、models.RevisionData r から e、r、r を選択します。ここで、(:_p0) の e.originalId.REV.id と e.originalId.REV.id = r.id および e.originalId.REV.id in (:_p1) および e.originalId.REV.id = r.id e.originalId.REV.id asc、e.originalId.REV.id asc による順序]

これのいくつかのバリエーションを試しましたが、すべて同じ「エイリアス 'r'の重複定義」につながりました。他に試せることはありますか?

4

1 に答える 1

0

これが私がこれまでに思いついたものです。これは最もクリーンなソリューションではありませんが、機能します:

AuditReader reader = AuditReaderFactory.get(entity.em());
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(type, false, true)
.add(AuditEntity.id().eq(entity.id));

List<Object[]> raw_results = query.getResultList();
List<Object[]> complete_results = new ArrayList<Object[]>(raw_results.size());

for (Object[] data : raw_results) {
    int rev_id = ((RevisionData) data[1]).getId();
    AuditQuery q = reader.createQuery()
    .forRevisionsOfEntity(type, false, true)
    .add(AuditEntity.revisionNumber().eq(rev_id));
    List<Object[]> real_data = q.getResultList();
    complete_results.addAll(real_data);
}

誰かがより良い方法、特に単一のクエリでそれを実行できる方法を考え出すことを願っています。

于 2011-08-11T21:54:37.550 に答える