我在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;
}
请告诉我,我需要使用任何东西来获得最大修订版本低于给定版本。
答案 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。