Определите элементы в списке, которые уже есть в базе данных, и удалите их - PullRequest
0 голосов
/ 31 января 2020

У меня есть сущность Student как: ID, имя (String), ...

У меня есть другая сущность ArchivedStudents как: ID, name (String), dateArchived, .. .

Я случайным образом генерирую список новых учеников и, прежде чем сохранить этот список в таблице учеников, я выполняю: Из списка новых учеников я пытаюсь удалить учеников с именем, которое уже существует в любом из них. Student или ArchivedStudents.

В настоящее время я передаю список имен учащихся и проверяю, существует ли он уже в таблице ArchiveStudent, а затем удаляю дубликаты. Затем проверьте, существует ли уже имя в таблице учеников, удалите дубликаты и сохраните оставшиеся.

Количество записей в таблицах ArchivedStudents и Student указано в миллионах.

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

1 Ответ

1 голос
/ 31 января 2020

Лучше всего сделать это одним выстрелом в базу данных:

List<Student> students = generateRandomStudents();
List<String> namesInDb = (List<String>) entityManager.createQuery("select s.name from Student s where s.name in :names")
    .setParameter("names", students.stream().map(Student::getName).collect(toList()))
    .getResultList();
studentsRepository.saveAll(students.stream().filter(s -> !namesInDb.contains(s.getName())).collect(toList()));
...