検索

13.7.6. クエリー

download PDF

13.7.6.1. 監査情報を取得する

概要

Hibernate Enver は、クエリーを介して監査情報を取得する機能を提供します。このトピックでは、これらのクエリーの例を示します。

注記
監査されたデータでのクエリーは、関連する subselect を伴うため、多くの場合、live データに対するクエリーよりもはるかに遅くなります。

例13.33 所定リビジョンでのクラスのエンティティーのクエリー

このタイプのクエリーのエントリーポイントは以下の通りです。
AuditQuery query = getAuditReader()
    .createQuery()
    .forEntitiesAtRevision(MyEntity.class, revisionNumber);
制約は AuditEntity ファクトリークラスを使用して指定できます。以下のクエリーは、name プロパティーが John と同等のエンティティーのみを選択します。
query.add(AuditEntity.property("name").eq("John"));
以下のクエリーは、特定のエンティティーに関連するエンティティーのみを選択します。
query.add(AuditEntity.property("address").eq(relatedEntityInstance));
// or
query.add(AuditEntity.relatedId("address").eq(relatedEntityId));
その結果は、順序付け、制限でき、集計と予測 (グループ化を除く) セットを設定することができます。以下の例は、フルクエリーです。
List personsAtAddress = getAuditReader().createQuery()
    .forEntitiesAtRevision(Person.class, 12)
    .addOrder(AuditEntity.property("surname").desc())
    .add(AuditEntity.relatedId("address").eq(addressId))
    .setFirstResult(4)
    .setMaxResults(2)
    .getResultList();

例13.34 所定クラスエンティティーが変更されるクエリーリビジョン

このタイプのクエリーのエントリーポイントは以下の通りです。
AuditQuery query = getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true);
このクエリーには、前述の例と同じように制約を追加できます。このクエリーには、追加の方法が考えられます。
AuditEntity.revisionNumber()
監査済みエンティティーが変更されたリビジョン番号の制約、展開、および順序を指定します。
AuditEntity.revisionProperty(propertyName)
監査済みエンティティーが変更されたリビジョンに対応する、リビジョンエンティティーのプロパティーに対する制約、調整および順序付けを指定します。
AuditEntity.revisionType()
リビジョンのタイプ (ADD、MOD、DEL) へのアクセスを提供します。
クエリー結果は必要に応じて調整できます。以下のクエリーは、エンティティーの最小のリビジョン番号を選択しますMyEntityクラス、entityIdリビジョン番号 42 以降、ID が変更されました:
Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.id().eq(entityId))
    .add(AuditEntity.revisionNumber().gt(42))
    .getSingleResult();
リビジョンのクエリーは、プロパティーを最小限に抑えたり、最大値にしたりすることもできます。以下のクエリーは、特定のエンティティーの actualDate の値が指定の値よりも大きくなるリビジョンを選択しますが、可能な限り小さくなります。
Number revision = (Number) getAuditReader().createQuery()
    .forRevisionsOfEntity(MyEntity.class, false, true)
    // We are only interested in the first revision
    .setProjection(AuditEntity.revisionNumber().min())
    .add(AuditEntity.property("actualDate").minimize()
        .add(AuditEntity.property("actualDate").ge(givenDate))
        .add(AuditEntity.id().eq(givenEntityId)))
    .getSingleResult();
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())
ThehasChanged条件は、追加の基準と組み合わせることができます。以下のクエリーは、revisionNumber の生成時に MyEntity の水平スライスを返します。変更されたリビジョンに限定されますprop1、だがしかしprop2
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());

例13.36 指定リビジョンでのクエリーエンティティーの変更

以下の例は、特定のリビジョンで変更されたエンティティーの基本クエリーを示しています。指定されたリビジョンで変更されたエンティティー名と対応する Java クラスを取得することができます。
Set<Pair<String, Class>> modifiedEntityTypes = getAuditReader()
    .getCrossTypeRevisionChangesReader().findEntityTypes(revisionNumber);
からもアクセスできる他のクエリーがいくつかあります org.hibernate.envers.CrossTypeRevisionChangesReader:
List<Object> findEntities(Number)
指定のリビジョンで変更された (追加、更新、削除された) すべての監査済みエンティティーのスナップショットを返します。n+1 SQL クエリーを実行します。n は、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。
List<Object> findEntities(Number, RevisionType)
変更タイプでフィルターされた特定のリビジョンで変更 (追加、更新、または削除) されたすべての監査済みエンティティーのスナップショットを返します。n+1 SQL クエリーを実行します。n は、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。
Map<RevisionType, List<Object>> findEntitiesGroupByRevisionType(Number)
変更操作 (追加、更新、削除など) ごとにグループ化されたエンティティースナップショットのリストを含むマップを返します。3n+1 SQL クエリーを実行します。n は、指定されたリビジョン内で変更された複数の異なるエンティティークラスです。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.