Optional<List<T>> 用于存储库层中的空列表返回 Optional.empty 。如何更改它以返回 Optional[[]]

Mar*_*hya 2 java optional spring-data-jpa spring-boot

我有一个这样的 JPA 查询。

PersonRepository.java

public Optional<List<PersonEntity>> findByStatus(int status);
Run Code Online (Sandbox Code Playgroud)

人员服务.java

System.out.println(“Optional value is ”+findByStatus(1));
Run Code Online (Sandbox Code Playgroud)

输出是 Optional value is Optional.empty

现在我改变了我的查询 PersonRepository.java

public List<PersonEntity> findByStatus(int status);
Run Code Online (Sandbox Code Playgroud)

人员服务.java

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

输出是 Optional value is Optional[[]]

在我的数据库中,状态 1 没有值。我想要我的输出作为Optional[[]]第一个查询。我如何实现这一目标?

现在,我想实现这一点,因为每当optional.get()抛出 a 时NoSuchElementException,我将使用我的异常控制器处理它并将其作为 404 公开给 REST 层。但是,当List<Object>获取a 时,响应只是一个空 List,但optional.get()仍然抛出 a NoSuchElementException。我想避免这种情况。简而言之,NoSuchElementException如果没有找到值,那么从 Repository 中可选的 fetch 就会抛出,这是完美的。但是对于空实体列表的可选提取,应该返回为空而不是抛出,NoSuchElementException因为它不是 404 错误。这只是意味着该列表目前为空。

Sim*_*lli 11

 public Optional<List<PersonEntity>> findByStatus(int status);
Run Code Online (Sandbox Code Playgroud)

没有意义。

正确的签名是

 List<PersonEntity> findByStatus(int status);
Run Code Online (Sandbox Code Playgroud)

如果没有 PersonEntity 列表将为空。

  • 我想用Optional 包装List&lt;PersonEntity&gt; 以便默认情况下可以处理NPE。但是,如果 List&lt;PersonEntity&gt; 为空,我不希望Optional 抛出NoSuchElementException。 (2认同)
  • 如果没有任何内容,列表将永远不会为 `null`,它将是一个空的 `List`。 (2认同)
  • @M.Deinum 这就是我在回答中写的。感谢您强调! (2认同)
  • 数字“零”在很多课堂上也一次又一次地重复。这仍然不是“冗余代码”。 (2认同)