Заменить исключение SQL пустым объектом - PullRequest
1 голос
/ 22 марта 2019

Я использую этот запрос SQL для получения простого объекта:

@Override
    public Optional<PaymentTransactions> paymentTransactionByWpfPaymentId(Integer id) {
        String hql = "SELECT t FROM " + PaymentTransactions.class.getName() + " t " 
                + " WHERE wppt.wpf_payment_id = :id ";
        TypedQuery<PaymentTransactions> query = entityManager.createQuery(hql, PaymentTransactions.class).setParameter("id", id);
        List<PaymentTransactions> wpfPayments = query.getResultList();
        return wpfPayments.isEmpty() ? Optional.empty() : Optional.of(wpfPayments.get(0));
    }

Я использую эту конечную точку

@GetMapping("/{id}")
    public ResponseEntity<List<PaymentTransactionsDTO>> getWpf_reference_transactions(@PathVariable String id) throws NumberFormatException, Exception {

        Optional<PaymentTransactions> tnx = wpfPaymentsService.paymentTransactionByWpfPaymentId(Integer.parseInt(id));

        if(tnx.get().getId() != 0) {
            return ResponseEntity.ok(transactionService
                    .get(Integer.valueOf(tnx.get().getId())).stream()
                    .collect(Collectors.toList()));
        } 

        return ResponseEntity.notFound().build();
    }

Но когда база данных пуста, я получаю java.util.NoSuchElementException: No value present.Есть ли способ вернуть просто пустой объект без этого исключения?

Ответы [ 3 ]

2 голосов
/ 22 марта 2019

Вы можете упростить вашу инструкцию возврата, используя

return tnx.map(PaymentTransactions::getId)
          .filter(id -> id != 0)
          .map(id -> transactionService.get(id)
                                       .stream()
                                       .collect(Collectors.toList()))
          .map(ResponseEntity::ok)
          .orElse(ResponseEntity.notFound().build());

Для более чистого подхода.

Кроме того, это

id -> transactionService.get(id)
                        .stream()
                        .collect(Collectors.toList()

может стать

id -> new ArrayList<>(transactionService.get(id)))

и поэтому у вас есть

tnx.map(Transaction::getId)
   .filter(id -> id != 0)
   .map(id -> new ArrayList<>(transactionService.get(id)))
   .map(ResponseEntity::ok)
   .orElse(ResponseEntity.notFound().build());

Я также сомневаюсь, что вам нужно

id -> new ArrayList<>(transactionService.get(id))

Вместо этого этого достаточно

id -> transactionService.get(id)

Поскольку вы не можете коснуться этого List на всех.

1 голос
/ 22 марта 2019

Optional.get() выдаст NoSuchElementException - if there is no value present, поэтому используйте isPresent, чтобы узнать, присутствует ли значение в необязательном порядке или нет

if(tnx.isPresent() && tnx.get().getId() != 0) {
        return ResponseEntity.ok(transactionService
                .get(Integer.valueOf(tnx.get().getId())).stream()
                .collect(Collectors.toList()));
    } 

    return ResponseEntity.notFound().build();
0 голосов
/ 22 марта 2019

Да. Откуда исходит ваше исключение, оберните его в блок try/catch следующим образом:

try {
    <code that throws exception>
} catch (NoSuchElementException e) {
    return new MyObject();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...