3

したがって、私の問題は、特定のクラスの最近削除されたエンティティ、つまり特定のタイムスタンプ以降に削除されたエンティティをすべて見つける必要があることです。具体的には、過去 1 時間以内に削除されたエンティティを検索したいと考えています。

私のすべてのエンティティには、リスナーで正しく維持する作成および更新されたタイムスタンプがあります。

@NotNull
@Column(name = "updated")
@Type(type="org.joda.time.contrib.hibernate.PersistentDateTime")
private DateTime updated;

Envers も使用し、エンティティに注釈を付けます。

推測すると、クエリは次のように開始する必要があります。

// Query for deleted bookings
AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Booking.class, false, true)

しかし、DateTime以降に削除された予約を見つけるためにここに何を置くべきかわかりません。

4

2 に答える 2

10

まず、1 時間前 (ミリ秒単位) のタイムスタンプを取得します。

long timestamp = (System.getCurrentTimeMillis()) - (60*60*1000);

次に、タイムスタンプに関連してクエリを実行できます。

AuditReader reader = AuditReaderFactory.get(entityManager);
AuditQuery query = reader.createQuery()
.forRevisionsOfEntity(Booking.class, false, true)
.add(AuditEntity.revisionProperty("timestamp").gt(timestamp)
.add(AuditEntity.revisionType().eq(RevisionType.DEL));

List<Object[]> results = query.getResultList();

リビジョンデータを取得します。それぞれObject[]

  1. リビジョン メタデータ (DefaultRevisionEntityまたは で注釈を付けた独自のクラス@RevisionEntity(CustomRevisionListener.class))
  2. エンティティ インスタンス (Bookingこの場合は)
  3. 、この場合RevisionTypeは常にあることがわかっていますDEL
于 2011-08-11T16:35:18.207 に答える
3

Envers APIは非常に制限されており、プレーンなJPAだけを使用するように変更する必要がある場合があります。ただし、これはそのようなケースの1つではありません。次のようにすることで、ユースケースを実現できると思います。

AuditQuery query = reader.createQuery().forRevisionsOfEntity(classType, false, true)
        .add(AuditEntity.revisionType().eq(RevisionType.DEL))
        .addProjection(AuditEntity.property(ID).distinct())
        .add(AuditEntity.revisionNumber().gt(revisionNumber);

上記の例ではリビジョン番号を使用していますが、探している開始日からリビジョン番号を簡単に取得できます。

于 2011-07-30T22:10:00.710 に答える