2014-08-28 54 views
0

使用Hibernate Envers(4.1.9.Final)。尝试获取某个实体已经更改某种类型并且符合某个标准的所有修订(日期,修订号)。Hibernate Envers获取修订条件

这是我目前具有代码:

AuditReader auditReader = AuditReaderFactory.get(entityManager); 
    AuditQuery query = auditReader.createQuery() 
      .forRevisionsOfEntity(InventoryItem.class, false, true) 
      .add(AuditEntity.property("section_uuid").eq(sectionUuid)) 
      .addOrder(AuditEntity.revisionNumber().desc()); 
    List<Object[]> revisions = query.getResultList(); 
  1. 这将返回每一个元素改变InventoryItem。所以,如果修改两个InventoryItem,我会得到两个元素 - 我不希望这样。
  2. 这也会返回实际的InventoryItem s,我认为这有点沉重 - 我不希望那样。

我怎样才能得到一个独特的版本集合(日期,版本号)?

回答

0

我认为你要找的是AuditQuery上的addProjection方法。您可以在修订号和日期上添加投影。

+0

我认为你是对的。我玩了一些*预测*,但没有完全奏效。它一定已经太迟了,太累了,因为有了你的新动力,我的工作很快。 – 2014-08-28 15:13:11

1

在Adam的回答的基础上,下面是我实现的代码。我会将他的答案标记为已接受的答案。

AuditReader auditReader = AuditReaderFactory.get(entityManager); 
AuditQuery query = auditReader.createQuery() 
    .forRevisionsOfEntity(InventoryItem.class, false, true) 
    .addProjection(AuditEntity.revisionNumber().distinct()) 
    .addProjection(AuditEntity.revisionProperty("created")) 
    .add(AuditEntity.property("section_uuid").eq(sectionUuid)) 
    .addOrder(AuditEntity.revisionNumber().desc()); 

结果,query.getResultList()将返回Object[],其中每个Object[]包含一个集合:

  • Object[0]:版本号为int
  • Object[1]:修订日期为java.util.Date,对应createdrevisionProperty