Hibernate Envers中最新修改实体的日期

时间:2016-01-31 16:33:02

标签: java hibernate jpa hibernate-envers

假设我们有一个经过审核的实体,例如:

@Entity
@Audited
public class Person {

    @Id
    private Long id;

    private String name;

}

并且在存储/更新几百条记录之后,我需要在给定一组id s的情况下获取最新的修改实体。给定Envers表逻辑,它将如下所示:

SELECT MAX(R.REVTSTMP) FROM PERSON_AUD P JOIN REVINFO R ON P.REV = R.REV
WHERE P.ID IN (12, 35, 143, 151, 165, 188, 234, 251);

但我找不到通过JPA或Envers API获取此信息的方法。请注意,我正在寻找一种“Enver的方式”来做到这一点,试图避免使用本机SQL(加上审计表存储在与实体的单独的目录中)。

1 个答案:

答案 0 :(得分:0)

您可以通过AuditQuery扩展程序完成此操作:

Object[] results = (Object[]) AuditReaderFactory.get( entityManager )
    .createQuery()
    .forRevisionsOfEntity( YourEntity.class, false, false )
    .add( AuditEntity.revisionNumber().in( idsList ) )
    .addOrder( AuditEntity.revisionNumber().desc() )
    .setMaxResults( 1 )       
    .getSingleResult();

// Object[0] = YourEntity instance
// Object[1] = The RevisionEntity instance
// Object[2] = RevisionType enum value

我们目前不会公开AuditEntity.revisionTimestamp()属性访问者,因此您必须直接从Object[1]修订版实体实例中获取值。