在Javers中能否查询引用指定Project实体的所有关联实体变更?
在Javers中查询引用特定Project的所有实体变更记录
当然可以实现!Javers提供了灵活的查询API,能够通过实体的关联属性条件筛选出关联特定Project的所有实体变更记录。针对你给出的Project、House、Street实体结构,我们可以通过以下步骤来构建查询:
核心思路
我们需要针对所有引用Project的实体(比如House、Street),查询它们的变更记录中,关联的Project id与目标id匹配的条目。Javers的QueryBuilder支持通过属性路径条件来实现这种关联筛选。
代码示例
// 初始化Javers实例(根据你的实际配置调整,比如添加持久化等) Javers javers = JaversBuilder.javers() .registerEntity(Project.class) .registerEntity(House.class) .registerEntity(Street.class) .build(); // 指定要查询的目标Project ID Long targetProjectId = 100L; // 构建查询:同时查询House和Street实体,筛选关联Project ID匹配的变更 Query query = QueryBuilder.byClass(House.class, Street.class) // 使用属性路径"project.id"匹配目标Project ID .withPropertyCondition(JqlQueryBuilder.value("project.id").equal(targetProjectId)) .build(); // 执行查询获取所有所有符合条件的变更记录 List<Change> relevantChanges = javers.findChanges(query); // 遍历处理变更记录 for (Change change : relevantChanges) { // 这里可以根据需求格式化输出变更详情,比如变更类型、实体信息等 System.out.println("变更详情: " + change.prettyPrint()); }
关键细节说明
- 多实体类型查询:如果还有其他引用
Project的实体(比如Building、Park等),只需在byClass()方法中添加对应的类即可,比如byClass(House.class, Street.class, Building.class)。 - 属性路径调整:如果你的实体中关联
Project的属性名称不是project(比如叫relatedProject),需要将条件中的属性路径改为"relatedProject.id"。 - 扩展筛选条件:你还可以结合其他查询条件,比如添加时间范围(
.withDateAfter(LocalDate.of(2024,1,1)))、指定变更类型(.withChangeType(NewObject.class))等,进一步缩小查询范围。
内容的提问来源于stack exchange,提问作者Yendor
相关产品推荐
相关产品推荐

