【发布时间】:2018-09-05 12:24:09
【问题描述】:
我有一个这样的 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[[]]。我如何做到这一点?
现在,我想实现这一点,因为每当 optional.get() 抛出 NoSuchElementException 时,我将使用我的异常控制器处理它并将其作为 404 公开给 REST 层。但是,当获取List<Object> 时,响应只是一个空列表,但optional.get() 仍然会抛出NoSuchElementException。我想避免这种情况。简而言之,如果没有找到完美的值,则从存储库中可选地获取单个实体会抛出 NoSuchElementException。但是对于空的实体列表的可选获取应该返回为空而不是抛出NoSuchElementException,因为它不是404错误。只是表示当前列表是空的。
【问题讨论】:
-
你想要一个可选的集合吗?什么都没有发现列表是空的,
Optional.empty()怎么更好? -
@M.Deinum 我已经更新了我的要求。请看一下
-
如果您不将列表包装在可选项中,您已经得到了。
-
@M.Deinum 正确。现在我面临代码标准的问题。在一种情况下(单个实体获取),我需要强制
Optional为强制性,而在另一种情况下,永远不应允许 Optional。 -
我有类似的使用场景,但我在 Spring Boot
2.4.0和2.4.10中得到了Optional.empty和Optional[[]]。真的很奇怪!
标签: java spring-boot spring-data-jpa optional