13.7.6. クエリー
13.7.6.1. 監査情報を取得する リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
概要
Hibernate Enver は、クエリーを介して監査情報を取得する機能を提供します。このトピックでは、これらのクエリーの例を示します。
注記
監査されたデータでのクエリーは、関連する subselect を伴うため、多くの場合、
live データに対するクエリーよりもはるかに遅くなります。
例13.33 所定リビジョンでのクラスのエンティティーのクエリー
このタイプのクエリーのエントリーポイントは以下の通りです。
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
AuditQuery query = getAuditReader()
.createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber);
制約は
AuditEntity ファクトリークラスを使用して指定できます。以下のクエリーは、name プロパティーが John と同等のエンティティーのみを選択します。
query.add(AuditEntity.property("name").eq("John"));
query.add(AuditEntity.property("name").eq("John"));
以下のクエリーは、特定のエンティティーに関連するエンティティーのみを選択します。
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
その結果は、順序付け、制限でき、集計と予測 (グループ化を除く) セットを設定することができます。以下の例は、フルクエリーです。
例13.34 所定クラスエンティティーが変更されるクエリーリビジョン
このタイプのクエリーのエントリーポイントは以下の通りです。
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true);
このクエリーには、前述の例と同じように制約を追加できます。このクエリーには、追加の方法が考えられます。
AuditEntity.revisionNumber()- 監査済みエンティティーが変更されたリビジョン番号の制約、展開、および順序を指定します。
AuditEntity.revisionProperty(propertyName)- 監査済みエンティティーが変更されたリビジョンに対応する、リビジョンエンティティーのプロパティーに対する制約、調整および順序付けを指定します。
AuditEntity.revisionType()- リビジョンのタイプ (ADD、MOD、DEL) へのアクセスを提供します。
クエリー結果は必要に応じて調整できます。以下のクエリーは、エンティティーの最小のリビジョン番号を選択します
MyEntityクラス、entityIdリビジョン番号 42 以降、ID が変更されました:
リビジョンのクエリーは、プロパティーを最小限に抑えたり、最大値にしたりすることもできます。以下のクエリーは、特定のエンティティーの
actualDate の値が指定の値よりも大きくなるリビジョンを選択しますが、可能な限り小さくなります。
minimize() および maximize() のメソッドは基準を返します。これは、制約を追加でき、 maximized/minimized プロパティーを持つエンティティーによって満たされる必要があります。
クエリーの作成時に、2 つのブール値パラメーターが渡されます。
selectEntitiesOnly- このパラメーターは、明示的な子が設定されていない場合のみ有効です。true の場合、クエリーの結果は、指定された制約を満たすリビジョンで変更されたエンティティーのリストになります。false の場合、結果は 3 つの要素の配列のリストになります。最初の要素は変更されたエンティティーインスタンスになります。次は、リビジョンデータを含むエンティティーです。カスタムエンティティーが使用されていない場合、
DefaultRevisionEntityのインスタンスになります。3 番目の要素アレイはリビジョンのタイプ (ADD、MOD、DEL) になります。 selectDeletedEntities- このパラメーターは、エンティティーが削除されたリビジョンを結果に含める必要があるかどうかを指定します。true の場合、エンティティーにはリビジョンタイプ
DELが指定され、id を除くすべてのフィールドの値はnullになります。
例13.35 所定プロパティーを変更するエンティティーのクエリーの修正
以下のクエリーは、のすべてのリビジョンを返します
MyEntity指定された ID を使用します。actualDateプロパティーが変更されました。
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
AuditQuery query = getAuditReader().createQuery()
.forRevisionsOfEntity(MyEntity.class, false, true)
.add(AuditEntity.id().eq(id));
.add(AuditEntity.property("actualDate").hasChanged())
The
hasChanged条件は、追加の基準と組み合わせることができます。以下のクエリーは、revisionNumber の生成時に MyEntity の水平スライスを返します。変更されたリビジョンに限定されますprop1、だがしかしprop2。
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
作成されたセットには、revisionNumber よりも少ない数字のリビジョンも含まれます。これは、このクエリーをすべてを返すと読み取ることができないことを意味します
MyEntitiesRevisionNumber で 変更 されましたprop1変更され、prop2手つかず。
以下のクエリーは、を使用してこの結果を返す方法を示しています。
forEntitiesModifiedAtRevisionクエリー:
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
AuditQuery query = getAuditReader().createQuery()
.forEntitiesModifiedAtRevision(MyEntity.class, revisionNumber)
.add(AuditEntity.property("prop1").hasChanged())
.add(AuditEntity.property("prop2").hasNotChanged());
例13.36 指定リビジョンでのクエリーエンティティーの変更
以下の例は、特定のリビジョンで変更されたエンティティーの基本クエリーを示しています。指定されたリビジョンで変更されたエンティティー名と対応する Java クラスを取得することができます。
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
.getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
からもアクセスできる他のクエリーがいくつかあります
org.hibernate.envers.CrossTypeRevisionChangesReader:
List<Object> findEntities(Number)- 指定のリビジョンで変更された (追加、更新、削除された) すべての監査済みエンティティーのスナップショットを返します。
n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。 List<Object> findEntities(Number, RevisionType)- 変更タイプでフィルターされた特定のリビジョンで変更 (追加、更新、または削除) されたすべての監査済みエンティティーのスナップショットを返します。
n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。 Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)- 変更操作 (追加、更新、削除など) ごとにグループ化されたエンティティースナップショットのリストを含むマップを返します。
3n+1SQL クエリーを実行します。nは、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。