2016-10-19 83 views
1

我寫了一個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查詢來實現這個需求,或者可以分頁後這個樣子?

+0

我遇到了這個問題,試圖實現同樣的事情。回想一下,你仍然可以通過這種方式解決你獲得HistoryEntries分頁結果的問題嗎? (或者,你現在是否創建了某種類型的存儲庫?) – Spork

回答

2

看起來,PageImpl類預計您在構造函數中提供的List<T>是給定頁面的行的子集,已經預先排序。因此,我們需要將排序操作作爲Envers查詢的一部分。

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

以這種方式應用排序將允許您從結果中選擇頁面子集的代碼按預期工作。