Na przykład mamy gromadzone obiekty w DB (na przykład uproszczone do ciągów):

Collection<String> existed = someRepository.findElements(); //returns "A", "B", "B", "C"

Mamy nową kolekcję, która musi zastąpić stare dane:

Collection<String> received = Arrays.asList("B", "C", "C" ,"D");

Pierwszym pomysłem było usunięcie wszystkich poprzednich danych z DB i zapisz wszystkie z kolekcji received jak:

someRepository.removeAll(existed);
someRepository.saveAll(received);

Ale w przypadku partii wspólnych elementów spowoduje, że nadwyżka transferu danych między aplikacją a db.

Z drugiej strony możemy znaleźć elementy, co usunięcie, aby dodać, ale wymaga dużo metody equals wywołanie i będzie wolniejsze, aby sprawdzić wszystkie elementy w pamięci, a imho nie jest dobre.

Głównie spodziewany wynik jest:

  • "A", drugi "B" będzie w kolekcji toremove (wzywamy do removeAll)
  • Jeden "C", "D" będzie w kolekcji Tadd (że nazywamy saveAll)
  • Wspólny "B" i "C" nie zostanie dotknięty

Czy masz jakieś rozwiązanie do rozwiązania takich przypadków bardziej zoptymalizowane? Dzięki.

0
bench_doos 23 lipiec 2020, 13:34

1 odpowiedź

Najlepsza odpowiedź

Znaleźliśmy narzędzia z Apache Commons:

Collection intersection = CollectionUtils.intersection(existed, received); //intersection between 2 collections

Collection toRemove = CollectionUtils.disjunction(existed, intersection); //getting disjunction between existed and intersection
Collection toAdd = CollectionUtils.disjunction(received, intersection); //getting disjunction between received and intersection
0
bench_doos 23 lipiec 2020, 11:30