【问题标题】:Implementing paging with hibernate envers使用休眠环境实现分页
【发布时间】:2016-10-19 15:01:06
【问题描述】:

我写了一个如下的 envers 查询;

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

我想做的是在页面中获取结果,就像在 PagingAndSortingRepository&lt;T,ID&gt; 中所做的那样,我几乎可以正常工作,如下所示

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&amp;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 查询来完成,还是分页可以处理这个?

【问题讨论】:

  • 我遇到了这个问题,试图实现同样的目标。回过头来看,你还会用这种方式解决获取 HistoryEntries 的分页结果的问题吗? (或者,您现在会创建某种存储库吗?)

标签: java hibernate hibernate-envers


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 1970-01-01
    • 2015-01-19
    • 1970-01-01
    • 2016-05-27
    • 2016-03-31
    相关资源
    最近更新 更多