java - 用空对象替换 SQL 异常
问题描述
我使用这个 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
. 有没有办法在没有这个异常的情况下只返回空对象?
解决方案
您可以使用简化您的退货声明
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
。
推荐阅读
- php - 热门附加表单输入以显示为评论部分用户 ID?
- node.js - Node.js 可写流:write vs _write
- java - 输入字符串之前的 Java 数字总和
- javascript - 没有 Jquery - 为 On Click 监控与动态变化的子 div 的“类”匹配的 div
- javascript - 有没有办法检查一个变量的值是否与另一个变量的值相同?
- video - ffmpeg : 转换在 Google 上合法购买的视频
- sql - 两个表的联合并比较第三个表的重复项?
- java - 如何将列表数据变量传递给存储过程并执行存储过程?
- node.js - NodeJS模块中数据文件的相对路径
- flutter - 为什么未显式设置 bloc 时从未调用 BlocBuilder