Найти значения нескольких дочерних слоев (используя l oop ???) - PullRequest
0 голосов
/ 14 февраля 2020

Я не был уверен в том, как искать это, поэтому был действительно неудачным Я просто начну с классов данных, которые у меня есть,

Вот учебный объект (пример)

@Data
@Entity
@Table(name = "TRAINING_PLAN")
@JsonIgnoreProperties({"trainings"})
public class TrainingPlan {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;

@Column(name = "CURRENT_PHASE")
private int currentPhase;

@Column(name = "PREVIOUS_TRAINING_PLAN_ID")
private Long previousTrainingPlanId;

@OneToMany(mappedBy = "trainingPlan", fetch = FetchType.LAZY)
private List<Training> trainings = new ArrayList<Training>();

Вот учебный объект (пример)

@Data
@Entity
@Table(name = "TRAINING")
public class Training {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID")
private Long id;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "TRAINING_PLAN_ID")
private TrainingPlan trainingPlan;

Я надеюсь, что смогу объяснить это четко, поэтому я пытаюсь добиться того, чтобы получить тренинги на всех предыдущих (TrainingPlan) фазах.

Как это работает - когда следующая (новая TrainingPlan) фаза плана Создается так, что он ссылается на старый План с помощью предыдущегоPlanId, поэтому он распознает своего родителя (его похожие слои).

Так, например, если у TrainingPlan есть фаза 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;
}

Теперь проблема в том, что если план находится на Фазе 5, мне нужно пройти тренинги на всех 4 предыдущих фазах, и вот где я застрял, не могу придумать метод автоматически l oop это. Надеюсь, я объяснил это не слишком сложно для понимания. Любые советы или вопросы приветствуются.

Здесь мне нужно что-то похожее на:

List<List<Training>> getTrainingsFromAllPreviousPhases()

1 Ответ

0 голосов
/ 14 февраля 2020

Вы можете выполнить l oop на всех этапах плана, например:

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

Тогда код можно упростить (как визуально, так и с точки зрения сложности O (n)):

TrainingPlan currentPlan = plan;
List<Training> allTrainings = new ArrayList<>();
while (currentPlan.getPreviousTrainingPlanId() != null) {
    TrainingPlan previousPlanPhase = planMap.get(currentPlan.getPreviousTrainingPlanId());
    allTrainings.addAll(previousPlanPhase.getTrainings());
    currentPlan = previousPlanPhase;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...