2011-06-30 11 views
3

私の問題は、特定のクラスの最近削除されたエンティティ、つまり特定のタイムスタンプ以降に削除されたエンティティをすべて見つける必要があることです。具体的には、直近の1時間以内に削除されたエンティティを探したい。私もEnversを使用して、私のエンティティに注釈を付けるHibernateエンバーを使用して最近削除されたエンティティを見つける

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

すべての私のエンティティは、私がリスナーに正しく維持作成と更新されたタイムスタンプを持っています。だから、推測する

、私のクエリは次のように起動する必要があります:

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

が、私は削除した予約の日時以降を見つけるためにここに入れているかわかりません。

答えて

3

Envers APIは非常に限られており、時には単純なJPAだけを使用する必要があることがあります。

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

上記の例では、リビジョン番号を使用していますが、簡単に開始日からあなたをリビジョン番号を取得できます。しかし、これは私はあなたが以下のようにして、あなたのユースケースを実現することができると信じて、これらのケースではありません探しています。

9

まず、(ミリ秒単位)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[]は、メタデータ(DefaultRevisionEntityまたは@RevisionEntity(CustomRevisionListener.class)で注釈を付け、独自のクラス)

  • エンティティインスタンス(この場合はBooking
  • は、私たちが知っているRevisionTypeは、常にこの中DELになります

    1. リビジョンを持っていますケース
  • 関連する問題