Поиск недавно удаленных объектов с помощью Hibernate envers - PullRequest
3 голосов
/ 30 июня 2011

Так что моя проблема в том, что мне нужно найти все недавно удаленные сущности определенного класса, то есть сущности, которые были удалены с определенной временной отметки. В частности, я хочу найти сущности, удаленные за последний час.

У всех моих сущностей есть созданная и обновленная метка времени, которую я правильно поддерживаю со слушателем:

@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)

но я не знаю, что здесь разместить, чтобы найти удаленное бронирование, начиная с даты / времени.

Ответы [ 2 ]

10 голосов
/ 11 августа 2011

Сначала получите временную метку за час назад (в миллисекундах):

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 в данном случае
3 голосов
/ 31 июля 2011

Я считаю, что 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);

В приведенном выше примере используется номер ревизии, но вы можете легко получить номер ревизии из даты начала, которую вы ищете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...