Java Hibernate Envers中最新修改实体的日期
假设我们有一个经审计的实体,例如:Java Hibernate Envers中最新修改实体的日期,java,hibernate,jpa,hibernate-envers,Java,Hibernate,Jpa,Hibernate Envers,假设我们有一个经审计的实体,例如: @Entity @Audited public class Person { @Id private Long id; private String name; } 在存储/更新了数百条记录之后,我需要得到一组ids的最新修改实体。考虑到Envers表逻辑,它将非常简单: SELECT MAX(R.REVTSTMP) FROM PERSON_AUD P JOIN REVINFO R ON P.REV = R.REV WHERE
@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或EnversAPI获取这些信息的方法。请注意,我正在寻找一种“Enver的方法”来实现这一点,试图避免原生SQL(加上审计表存储在实体目录之外的单独目录中)。您可以通过
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()
属性访问器,因此您必须直接从对象[1]
修订实体实例获取值。现在,我将获取所有实体,并使用列表上的流计算最新修订日期,但它效率很低,因为我需要加载所有实体。