Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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/3/clojure/3.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
Spring 查找多层子对象的值(使用循环??)_Spring_Jpa - Fatal编程技术网

Spring 查找多层子对象的值(使用循环??)

Spring 查找多层子对象的值(使用循环??),spring,jpa,Spring,Jpa,我不知道如何搜索这个,所以真的没有成功。我将从我拥有的数据类开始 以下是培训计划实体(示例) 我希望我能够清楚地解释这一点,所以我在这里试图实现的是从所有之前的(培训计划)阶段获得培训 工作原理-当创建下一个(新培训计划)计划阶段时,它会使用先前的PlanID引用旧计划,以便识别其父计划(类似的层) 因此,例如,如果培训计划有第2阶段,我可以很容易地从第1阶段以类似的方式获得培训: public List<Training> trainingsFromPreviousPhas

我不知道如何搜索这个,所以真的没有成功。我将从我拥有的数据类开始

以下是培训计划实体(示例)

我希望我能够清楚地解释这一点,所以我在这里试图实现的是从所有之前的(培训计划)阶段获得培训

工作原理-当创建下一个(新培训计划)计划阶段时,它会使用先前的PlanID引用旧计划,以便识别其父计划(类似的层)

因此,例如,如果培训计划有第2阶段,我可以很容易地从第1阶段以类似的方式获得培训:

    public List<Training> trainingsFromPreviousPhase(TrainingPlan plan, List<TrainingPlan> planList) {
    List<Training> previousPhaseTrainings = new ArrayList<Training>();

    if (plan.getPreviousTrainingPlanId() != null) {
        TrainingPlan previousPlanPhase = planList.parallelStream()
                .filter(e -> e.getId() == plan.getPreviousTrainingPlanId()).findAny().get();
        previousPhaseTrainings = previousPlanPhase.getTrainings();

}
    return previousPhaseTrainings;
}
上一阶段的公共培训列表(培训计划,列表计划列表){
List previousPhaseTrainings=new ArrayList();
if(plan.getPreviousTrainingPlanId()!=null){
培训计划previousPlanPhase=planList.parallelStream()
.filter(e->e.getId()==plan.getPreviousTrainingPlanId()).findAny().get();
previousPhaseTrainings=previousPlanPhase.getTrainings();
}
返回以前的相位图;
}
现在的问题是,如果一个计划是在第五阶段,我需要从之前的四个阶段得到培训,这就是我被卡住的地方,我想不出一个方法来自动循环。我希望我解释这个不太难理解。欢迎提出任何建议或问题

这里我需要的是类似于:

List<List<Training>> getTrainingsFromAllPreviousPhases()
List getTrainingsFromAllPreviousPhases()

您可以像这样循环执行所有计划阶段:

TrainingPlan currentPlan = plan;
List<Training> allTrainings = new ArrayList<>();
while (cirrentPlan.getPreviousTrainingPlanId() != null) {
    TrainingPlan previousPlanPhase = planList.parallelStream()
        .filter(e -> e.getId() == currentPlan.getPreviousTrainingPlanId()).findAny().get();
    allTrainings.addAll(previousPlanPhase.getTrainings());
    currentPlan = previousPlanPhase;
}

培训计划当前计划=计划;
列出所有培训=新建ArrayList();
while(cirrentPlan.getPreviousTrainingPlanId()!=null){
培训计划previousPlanPhase=planList.parallelStream()
.filter(e->e.getId()==currentPlan.getPreviousTrainingPlanId()).findAny().get();
allTrainings.addAll(previousPlanPhase.getTrainings());
当前计划=上一个计划阶段;
}
但是,为了避免重复查看计划列表以查找id,我建议将它们保存在地图中:

Map<Long, TrainingPlan> planMap = planList.stream()
    .collect(Collectors.toMap(TrainingPlan::getId, Function.identity());
Map planMap=planList.stream()
.collect(Collectors.toMap(TrainingPlan::getId,Function.identity());
然后可以简化代码(视觉上和O(n)复杂度方面):

培训计划当前计划=计划;
列出所有培训=新建ArrayList();
while(currentPlan.getPreviousTrainingPlanId()!=null){
培训计划previousPlanPhase=planMap.get(currentPlan.getPreviousTrainingPlanId());
allTrainings.addAll(previousPlanPhase.getTrainings());
当前计划=上一个计划阶段;
}

如果我理解正确,您正在寻找一个递归函数,即一个可以调用自身并处理任意数量嵌套级别的方法。示例:伙计们,您很完美,这正是我想要的!谢谢!!!:)
TrainingPlan currentPlan = plan;
List<Training> allTrainings = new ArrayList<>();
while (cirrentPlan.getPreviousTrainingPlanId() != null) {
    TrainingPlan previousPlanPhase = planList.parallelStream()
        .filter(e -> e.getId() == currentPlan.getPreviousTrainingPlanId()).findAny().get();
    allTrainings.addAll(previousPlanPhase.getTrainings());
    currentPlan = previousPlanPhase;
}

Map<Long, TrainingPlan> planMap = planList.stream()
    .collect(Collectors.toMap(TrainingPlan::getId, Function.identity());
TrainingPlan currentPlan = plan;
List<Training> allTrainings = new ArrayList<>();
while (currentPlan.getPreviousTrainingPlanId() != null) {
    TrainingPlan previousPlanPhase = planMap.get(currentPlan.getPreviousTrainingPlanId());
    allTrainings.addAll(previousPlanPhase.getTrainings());
    currentPlan = previousPlanPhase;
}