Необязательный <List <T>> для пустого списка в слое репозитория. Возвращает Optional.empty. Как я могу изменить его, чтобы вернуть Необязательно [[]] - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть такой запрос JPA.

PersonRepository.java

public Optional<List<PersonEntity>> findByStatus(int status);

PersonService.java

System.out.println(“Optional value is ”+findByStatus(1));

Выход составляет Optional value is Optional.empty

Теперь я изменил свой запрос PersonRepository.java

public List<PersonEntity> findByStatus(int status);

PersonService.java

Optional<List<PersonEntity>> optional = Optional.of(findByStatus(1));
System.out.println("Optional value is "+optional);

Выход Optional value is Optional[[]]

В моей базе данных нет значения для статуса 1. Я хочу, чтобы мой вывод был Optional[[]] для 1-го запроса. Как мне этого добиться?

Теперь я хочу добиться этого, потому что всякий раз, когда optional.get() выбрасывает NoSuchElementException, я буду обрабатывать его с помощью моего контроллера исключений и выставлять его как 404 для уровня REST. Но когда выбирается List<Object>, ответом является только пустой список, но optional.get() все равно выдает NoSuchElementException. Я хочу избежать этого. Короче говоря, необязательная выборка Single Entity из репозитория выдает NoSuchElementException, если не найдено никакого идеального значения. Но для необязательного извлечения списка сущностей, который является пустым, он должен быть возвращен как пустой и не выбрасывать NoSuchElementException, поскольку это не ошибка 404. Это просто означает, что в настоящее время список пуст.

Ответы [ 3 ]

0 голосов
/ 05 сентября 2018
 public Optional<List<PersonEntity>> findByStatus(int status);

не имеет смысла.

Правильная подпись

 List<PersonEntity> findByStatus(int status);

если не существует PersonEntity, список будет пустым.

0 голосов
/ 05 сентября 2018

Я предлагаю вам перестать мыслить ориентированными на технику и начать мыслить ориентированными на смысл.

Под последним я подразумеваю: сущность функции поиска, в которой пользователь предоставляет точно известный идентификатор, и ожидается, что результатом будет не более, или точно, одна сущность в том, что она принципиально отличается от таковой функция поиска, в которой пользователь предоставляет некоторые критерии поиска и может быть возвращено любое количество подходящих объектов.

Первый - это когда логическая потребность для return null; или для throw new NotFoundException(); или для return Optional.ofNullable(null);

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

Сосредоточиться на сути функциональности гораздо важнее, чем сосредоточиться на конкретных методах.

EDIT

И если вы абсолютно хотите (хотя и напрашивается вопрос "почему") одного и того же типа возвращаемого значения для обоих видов функции поиска, то Collection <...> - это "правильный" вариант с пустая коллекция, обозначающая «Не найдено» в сценарии «поиск одной сущности».

0 голосов
/ 05 сентября 2018

Вы делаете разные вещи.

Optional<List<PersonEntity>>

означает, что оно имеет значение empty.

Я могу только предположить, что Spring делает что-то вроде:

if(list == null || list.isEmpty()) {
    return Optional.empty();
}

Во втором случае List<PersonEntity> является опциональным из пустого списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...