Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 使用envers获取小于特定版本的最大版本_Java_Hibernate_Hibernate Envers - Fatal编程技术网

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

Java 使用envers获取小于特定版本的最大版本,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,这个问题和我发现的一样 它工作正常,但问题是当我使用连接时,它没有给出单一结果,返回的所有修订少于给定修订 我的代码如下 AuditReader reader = AuditReaderFactory.get(session); AuditQueryCreator audQueryCreator = reader.createQuery(); AuditQuery query_cusTagInst = audQueryCreator.forEntitiesAtRevision(CustomTa

这个问题和我发现的一样

它工作正常,但问题是当我使用连接时,它没有给出单一结果,返回的所有修订少于给定修订

我的代码如下

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);
}

请告诉我,我是否需要使用任何东西来获得比给定版本少的max revision值。

如果您从纯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在实体实例本身上生成一个distinct,以便返回值是唯一的实体实例。这样可以避免连接/重复出现任何问题

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

然后我们应用一个
setMaxResults(1)
。基于这个目标,这与我们添加的order by子句密切相关,因为它要求Hibernate只返回感兴趣的单行,即位于结果集顶部的一行,该行的修订号小于或等于
修订ID


HTH.

如果您从纯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在实体实例本身上生成一个distinct,以便返回值是唯一的实体实例。这样可以避免连接/重复出现任何问题

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

然后我们应用一个
setMaxResults(1)
。基于这个目标,这与我们添加的order by子句密切相关,因为它要求Hibernate只返回感兴趣的单行,即位于结果集顶部的一行,该行的修订号小于或等于
修订ID


HTH.

您是希望得到作为结果的修订号还是实际的实体实例?此外,IDK这个
computeAggregationInInstanceContext
是什么?
#max()
方法仅适用于投影查询。不,我不希望只使用max revision。我试图找到每个实体的最大修订数小于或等于给定的修订数。我添加了与我的问题类似的问题链接。但是在这里,我必须使用Join,在添加Join之后,它会给出多个记录。computeAggregationInInstanceContext我用这个找到了它,从这个感谢中,我忘记了这一点,因为我几乎不使用它:)。您是希望得到作为结果的修订号还是实际的实体实例?此外,IDK这个
computeAggregationInInstanceContext
是什么?
#max()
方法仅适用于投影查询。不,我不希望只使用max revision。我试图找到每个实体的最大修订数小于或等于给定的修订数。我添加了与我的问题类似的问题链接。但是在这里我不得不使用连接,在添加连接后,它会给出多个记录。computeAggregationInInstanceContext我用这个找到了它,从这个感谢中,我忘记了这一点,因为我几乎不使用它:)。非常感谢你解释得太好了,但是在添加
addProjection(AuditEntity.selectEntity(true))时
查询结果给出了Instrument对象(我们正在对其执行联接),而它应该给出CustomTagInstance对象。我想这可能是因为JoinType,所以我也检查了Left join,但结果是一样的,然后我删除了这一行,之后我得到了一个结果,但这不是最大修订号记录小于或等于给定的修订Id,它选择了一些小于给定编号的随机值,而我想要最大顺序很重要???这意味着我改变了代码的顺序,在这之后,它给出了很好的结果,就像我做的那样(“instrument”,JoinType.INNER).add(AuditEntity.property(“instrumentId”).eq(id)).setMaxResults(1);非常感谢您的解释,但是在添加
addProjection(AuditEntity.selectEntity(true))时,
查询结果给出了instrument对象(我们正在对其执行连接),但它应该提供CustomTagInstance对象。我认为这可能是因为JoinType,所以我也检查了Left join,但结果相同,然后我删除了这一行,之后我得到了一个结果,但这不是最大修订号记录小于或等于给定的修订Id,它选择了一些小于给定n的随机值umber,虽然我想知道maxIs的顺序很重要???意味着我改变了你代码的顺序,之后就是giv了