有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用hibernate envers实现分页的java

我写了一个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) 个答案

  1. # 1 楼答案

    似乎PageImpl类希望您在构造函数中提供的List<T>是给定页面的行的子集,已经预先排序。因此,我们需要将排序操作作为Envers查询的一部分应用

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

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