如何通过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
相关产品推荐
相关产品推荐

