Как имитировать поведение List <Необязательно <T>> в Spring Data Repo? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь query База данных с list of Id's и, если они не существуют, делать с ними что-нибудь.

Мой план состоял в том, чтобы сделать что-то вроде

List<Optional<MyObject>> fingById(Set<String> myIds);

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

В конце концов, мне нужно получить эти объекты, обновить одно поле или создать их со значением по умолчанию, если оно отсутствует.

Какой лучший способ сделать это в пакетном режиме?

Спасибо:)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

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

List<MyObject> findAll();

После этого вы можете перебирать все объекты и проверять пропущенные идентификаторы. Чтобы улучшить производительность, я рекомендую использовать Map:

var objectMap = repository.findAll().stream()
    .collect(Collectors.toMap(MyObject::getId, Function::Identity);

Затем вы можете просто проверить, содержится ли какой-либо из идентификаторов на карте:

myIds.stream().filter(objectMap::contains)
    .forEach({
        // do some stuff, present id
    });

myIds.stream().filter((id) -> !myMap.contains(id))
    .forEach({
        // do some stuff, not present id
    });
0 голосов
/ 16 января 2019

Вы можете отобразить результаты по их идентификатору в Map<String, Optional<MyObject>>, а затем заполнить пробелы с помощью Optional.empty().

List<MyObject> findByIdIn(Set<String> ids);

default Map<String, Optional<MyObject>> mapByIdIn(Set<String> ids) {
    Map<String, Optional<MyObject>> found = findByIdIn(ids)
            .stream()
            .collect(Collectors.toMap(MyObject::getId, Optional::of));
    ids.stream()
       .filter(id -> !found.containsKey(id))
       .forEach(id -> found.put(id, Optional.empty()));
    return found;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...