Реализация подкачки с помощью hibernate envers


Я написал запрос envers, как показано ниже;

AuditReader reader = AuditReaderFactory.get(entityManager);
List<Object[]> changes = reader.createQuery()
    .forRevisionsOfEntity(cls, true, true)
    // Various conditions
    .getResultList();

То, что я хотел бы сделать, это получить результаты на страницах, как это можно сделать в PagingAndSortingRepository<T,ID>, у меня это почти работает, как показано ниже

int start = page.getOffset();
int end = (start + page.getPageSize()) > history.size() ? history.size() : (start + page.getPageSize());
Page page = new PageImpl<HistoryEntry>(history.subList(start, end), page, history.size());

Моя проблема заключается в том, что при выполнении этого способа я не могу сортировать данные, как ожидалось, т. е. size=2&sort=action,desc не сортирует независимо от того, какое значение я использую (asc/desc).

history представляет собой список объектов со следующими полями;

private String timestamp;
private String userName;
private String objectName;
private String objectType;
private String action;
private String field;
private String oldValue;
private String newValue;

Для реализации подкачки, фильтрации и сортировки через envers было бы это должно быть сделано с помощью оригинального запроса envers или может ли пейджинг позаботиться об этом?

1 2

1 ответ:

Похоже, что класс PageImpl ожидает, что List<T>, который вы предоставляете в конструкторе, будет подмножеством строк для данной страницы, уже предварительно отсортированных. Поэтому нам нужно будет применить операции сортировки как часть запроса Envers.

List<Object[]> changes = reader.createQuery()
.forRevisionsOfEntity( cls, true, false )
// various predicate conditions
.addOrder( AuditEntity.property( "someField" ).desc() )
.getResultList();

Примените сортировку таким образом, чтобы код, в котором вы выбрали подмножество для страницы из результатов, работал должным образом.