You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Javers查询仓库中所有对象的最新版本?

解决Javers获取所有对象最新状态的问题

你遇到的问题很典型——默认的findShadows查询会返回类的所有版本实例,包括更新过的对象的旧版本,所以才会出现计数不符的情况。Javers确实内置了直接获取每个对象最新版本的功能,不需要手动分组过滤,下面给你两种可行的解决方案:

方案一:使用limitByInstanceId(1)(推荐)

这是最直接的方式,limitByInstanceId方法可以指定每个实例ID只返回N个版本,设置为1时,Javers会自动为每个对象返回最新的版本。修改你的查询代码如下:

JqlQuery entryQuery = QueryBuilder.byClass(StringContainer.class)
    .limitByInstanceId(1)
    .build();

这个方法会按对象的@Id字段分组,每组仅保留最新的一条Shadow记录。用这个查询替换你原来的代码后,测试用例中的mostRecentShadows.size()会正确返回3,并且FOURTH_STRING会替换掉旧的SECOND_STRING,完全符合你的预期。

方案二:使用withLatestVersion()

你提到尝试过withLatestVersion()但方法不存在,这可能是IDE缓存或导入问题——在Javers 5.10.0版本中,QueryBuilder确实包含这个方法,它的作用是仅返回所有对象的最新版本。确认你导入的是org.javers.repository.jql.QueryBuilder,然后可以这样写:

JqlQuery entryQuery = QueryBuilder.byClass(StringContainer.class)
    .withLatestVersion()
    .build();

这个方法和limitByInstanceId(1)的效果一致,都是直接返回每个对象的最新状态。

为什么之前的尝试无效?

  • withVersion(-1):这个方法是用来指定全局版本号(Javers仓库的全局版本序列),而不是对象自身的版本号,所以负数不被支持,无法实现你想要的效果。
  • 手动分组过滤:虽然可行,但Javers已经提供了内置方法,完全不需要重复造轮子。

修改后的完整测试用例应该能通过所有断言,你可以直接验证。

内容的提问来源于stack exchange,提问作者Kira Resari

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 09:27:44