Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate Envers中最新修改实体的日期_Java_Hibernate_Jpa_Hibernate Envers - Fatal编程技术网

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]
修订实体实例获取值。

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