2016-10-19 36 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(); 

以这种方式应用排序将允许您从结果中选择页面子集的代码按预期工作。