Spring Data JPA中如何实现查询到实体存在时主动抛出异常
你当前的写法是可行的,但并不是唯一的实现方式,还有更简洁的原生写法可选。
可选实现方式
1. 直接使用JDK 8+原生Optional的ifPresent()方法
不用单独声明变量接收查询结果,直接链式调用即可:
dishRepository.findByName(dishCreationDTO.getName()) .ifPresent(existDish -> { throw new EntityNotFoundException("DB中已存在相同菜品"); });
这种写法是最常用的替代方案,不需要额外封装,兼容性好,代码更简洁。
2. 封装通用工具方法适配高频场景
如果你的项目中这类「查询到存在即抛出异常」的场景很多,可以封装通用工具类减少重复代码:
// 工具类定义 public class OptionalExtUtils { public static <T> void ifPresentThrow(Optional<T> optional, Supplier<RuntimeException> exceptionSupplier) { if (optional.isPresent()) { throw exceptionSupplier.get(); } } } // 业务代码调用 OptionalExtUtils.ifPresentThrow( dishRepository.findByName(dishCreationDTO.getName()), () -> new EntityNotFoundException("DB中已存在相同菜品") );
额外建议
注意你当前抛出的EntityNotFoundException语义和场景不匹配,这个异常通常用来表示「查询不到对应实体」,你当前是实体已存在的场景,建议替换为IllegalArgumentException或者自定义的EntityAlreadyExistsException,语义更清晰。
内容的提问来源于stack exchange,提问作者user16722881
相关产品推荐
相关产品推荐

