Java 休眠环境:仅获取更改的字段

Java 休眠环境:仅获取更改的字段,java,hibernate,hibernate-envers,revision-history,Java,Hibernate,Hibernate Envers,Revision History,如何仅从已审核实体获取修改的字段 当我使用 AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MyEntity.class, revisionNumber).getResultList() 我得到所有的领域;但我只想修改字段?而不使用修改标志功能 如果未在@Audited批注上使用“修改的标志”功能,则获得已审核属性从修订版X更改为修订版Y的唯一方法是实际获取两个修订,然后自己比较两个对象实例之间的实

如何仅从已审核实体获取修改的字段

当我使用

AuditQuery query = getAuditReader().createQuery().forEntitiesAtRevision(MyEntity.class, revisionNumber).getResultList()
我得到所有的领域;但我只想修改字段?

而不使用修改标志功能 如果未在
@Audited
批注上使用“修改的标志”功能,则获得已审核属性从修订版X更改为修订版Y的唯一方法是实际获取两个修订,然后自己比较两个对象实例之间的实际字段值

具有修改标志功能 假设您正在
@Audited
注释上使用修改的标志功能,目前唯一的方法是获取给定实体实例的修订号,并使用这些修订和已审核列的先验知识,使用Envers查询API询问是否为该修订更改了属性

显然,这种方法并不理想,因为它会将一些先验知识强加给用户代码,以了解为获得所需结果而审核的字段

List<Number> revisions = reader.getRevisions( MyEntity.class, myEntityId );
for ( Number revisionNumber : revisions ) {
  for ( String propertyName : propertyNamesToCheckList ) {
    final Long hits = reader.createQuery()
      .forRevisionsOfEntity( MyEntity.class, false, false  )
      .add( AuditEntity.id().eq( myEntityId ) )
      .add( AuditEntity.revisionNumber().eq( revisionNumber ) )
      .add( AuditEntity.propertyName( propertyName ).hasChanged() )
      .addProjection( AuditEntity.id().count() )
      .getSingleResult();

    if ( hits == 1 ) {
      // propertyName changed at revisionNumber
    }
    else {
      // propertyName didn't change at revisionNumber
    }
  }
}
此功能可能会被扩展或更改,因为它将被视为实验性的,但这是用户要求的,我们至少打算基于修改的标志提供此功能的第一步

目前我们还没有决定是否或者如何支持非修改标志,所以现在唯一的选择还是蛮力bean比较


有关此功能的更多详细信息,请参见。

“仅修改字段”,您需要字段的格式是什么?字符串数组?在修订编号和修订编号-1或当前之间?请更具体一点。我们支持我有实体人员id、姓名、生日,如果我修改名称,请使用所有字段创建修订版,并且我希望获得名称已从Melek更改为Melek Ellouze的示例。您想在重命名后对名称进行进一步更改吗?或者仅重命名?仅对修订版进行当前更改(仅重命名),但如果对同一修订版我更改了firstName和lastName,我希望将字段firstName从xxx更改为yyy lastName从xxx更改为YYYY,我找不到在字段发生更改时返回的方法!!我正在使用修改过的标志功能我添加了一个示例(未经测试),但它给了您一个想法。@Naros您对6.0.0何时发布有任何估计吗?@A_Di-Matteo我们现在正在完成最后一部分,以最终确定ORM的第一阶段alpha,因此我希望在未来3-6个月内的某个时候能够完成。
List results = reader.forRevisionsOfEntityWithChanges( MyEntity.class false )
   .add( AuditEntity.id().eq( entityId ) )
   .getResultList();

Object previousEntity = null;
for ( Object row : results ) {
  Object[] rowArray = (Object[]) row;
  final MyEntity entity = rowArray[0];
  final RevisionType revisionType = (RevisionType) rowArray[2];
  final Set<String> propertiesChanged = (Set<String>) rowArray[3];
  for ( String propertyName : propertiesChanged ) {
    // using the property name here you know
    // 1. that the property changed in this revision (no compare needed)
    // 2. Can get old/new values easily from previousEntity and entity
  }
}