【问题标题】:Date of the latest modified entity in Hibernate EnversHibernate Envers 中最新修改实体的日期
【发布时间】:2016-01-31 16:33:02
【问题描述】:

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

@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 P.ID IN (12, 35, 143, 151, 165, 188, 234, 251);

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

【问题讨论】:

  • 现在我正在获取所有实体并使用列表中的流计算最新的修订日期,但它的效率非常低,因为我需要加载所有实体。

标签: java hibernate jpa hibernate-envers


【解决方案1】:

您可以通过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] 修订实体实例中获取值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    • 2017-11-28
    • 2019-08-20
    • 2013-05-24
    • 1970-01-01
    • 2018-04-16
    • 2019-03-01
    相关资源
    最近更新 更多