Дата последнего измененного объекта в Hibernate Envers

Скажем, у нас есть проверяемый объект, такой как:

@Entity
@Audited
public class Person {

    @Id
    private Long id;

    private String name;

}

и после сохранения/обновления нескольких сотен записей мне нужно получить последний измененный объект с учетом набора ids. Учитывая логику таблицы Envers, это будет так же просто, как:

SELECT MAX(R.REVTSTMP) FROM PERSON_AUD P JOIN REVINFO R ON P.REV = R.REV
WHERE P.ID IN (12, 35, 143, 151, 165, 188, 234, 251);

но я не могу найти способ получить эту информацию через JPA или Envers API. Обратите внимание, что я ищу «способ Энвера» для этого, пытаясь избежать собственного SQL (плюс таблицы аудита хранятся в отдельном каталоге от каталога сущностей).


person Giovanni Lovato    schedule 31.01.2016    source источник
comment
Теперь я извлекаю все объекты и вычисляю дату последней версии с помощью потока в списке, но это крайне неэффективно, поскольку мне нужно загрузить все объекты.   -  person Giovanni Lovato    schedule 01.02.2016


Ответы (1)


Вы можете сделать это с помощью расширений AuditQuery:

Object[] results = (Object[]) AuditReaderFactory.get( entityManager )
    .createQuery()
    .forRevisionsOfEntity( YourEntity.class, false, false )
    .add( AuditEntity.revisionNumber().in( idsList ) )
    .addOrder( AuditEntity.revisionNumber().desc() )
    .setMaxResults( 1 )       
    .getSingleResult();

// Object[0] = YourEntity instance
// Object[1] = The RevisionEntity instance
// Object[2] = RevisionType enum value

В настоящее время мы не предоставляем метод доступа к свойству AuditEntity.revisionTimestamp(), поэтому вам придется извлекать значение непосредственно из экземпляра объекта ревизии Object[1].

person Naros    schedule 07.02.2017