使用envers获取小于特定修订版本的最大修订版本

时间:2017-04-27 05:24:48

标签: java hibernate hibernate-envers

我在Link

中找到了同样的问题

工作正常,但问题是当我使用加入时,它没有给出单个结果,它返回的所有版本都低于给定版本。

我的代码如下

AuditReader reader = AuditReaderFactory.get(session);
AuditQueryCreator audQueryCreator = reader.createQuery();

AuditQuery query_cusTagInst = audQueryCreator.forEntitiesAtRevision(CustomTagInstance.class, revision_Id)
                .add(AuditEntity.revisionNumber().le(revision_Id))
                .traverseRelation("instrument", JoinType.INNER)
                .add(AuditEntity.revisionNumber().maximize().computeAggregationInInstanceContext())
                .add( AuditEntity.property( "instrumentId" ).eq( id ) );
CustomTagInstance customTagInst = null;
List list_cusTagInst = query_cusTagInst.getResultList();
for(int i=0; i<list_cusTagInst.size(); i++){
    customTagInst = (CustomTagInstance) list_cusTagInst.get(i);
}

并且

@Audited
@Table(name = "CUSTOM_TAG_INSTANCE")
public class CustomTagInstance implements java.io.Serializable {

private Long tagInstanceId;
private Instrument instrument;

@Id
@Column(name = "TAG_INSTANCE_ID", unique = true, nullable = false, precision = 22, scale = 0)
public Long getTagInstanceId() {
    return this.tagInstanceId;
}

public void setTagInstanceId(Long tagInstanceId) {
    this.tagInstanceId = tagInstanceId;
}

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INSTRUMENT_ID")
public Instrument getInstrument() {
    return this.instrument;
}

public void setInstrument(Instrument instrument) {
    this.instrument = instrument;
}

请告诉我,我需要使用任何东西来获得最大修订版本低于给定版本。

1 个答案:

答案 0 :(得分:0)

如果从纯SQL角度来看这个,那么您正在描述的是尝试获取与特定谓词集匹配的值或值的集合。这自动意味着投影查询。

这里的解决方案如下:

final AuditQuery query = AuditReaderFactory.get( session )
  .createQuery()
  .forEntitiesAtRevision( CustomTag.class, revisionId )
  .add( AuditEntity.revisionNumber().le( revisionId ) )
  .traverseRelation( "instrument", JoinType.INNER )
  .add( AuditRevisionNumber().maximize().computeAggregationInInstanceContext() )
  .add( AuditEntity.property( "instrumentId" ).eq( id ) )
  .up()
  .addProjection( AuditEntity.selectEntity( true ) )
  .addOrder( AuditEntity.revisionNumber().desc() )
  .setMaxResults( 1 );

您缺少的关键部分是查询的最后三个行。

addProjection( AuditEntity.selectEntity( true ) )告诉Envers在实体实例上生成一个不同的实体,以便返回值是唯一的实体实例。这应该避免连接/重复的任何问题。

然后我们添加一个addOrder( AuditEnttiy.revisionNumber().desc() ) order by子句,Envers按降序排列结果。我们这样做是因为我们的目标是获得一个版本号小于或等于revisionId的行。通过这样做,该行将是我们的结果集中的第一行。

然后我们应用setMaxResults( 1 )。根据目标,这与我们添加的order by子句密切相关,因为这要求Hibernate仅返回感兴趣的单行,结果集顶部的那一行的修订号小于或者等于revisionId

HTH。