我写了一个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 :(得分:2)
PageImpl
类似乎期望您在构造函数中提供的List<T>
是给定页面的行的子集,已经预先排序。因此,我们需要将排序操作作为Envers查询的一部分来应用。
List<Object[]> changes = reader.createQuery()
.forRevisionsOfEntity( cls, true, false )
// various predicate conditions
.addOrder( AuditEntity.property( "someField" ).desc() )
.getResultList();
以这种方式应用排序,然后允许您从结果中选择页面子集的代码按预期工作。