【问题标题】:Optional<List<T>> for Empty List in Repository Layer Returns Optional.empty . How do I change it to return Optional[[]]存储库层中空列表的 Optional<List<T>> 返回 Optional.empty 。如何将其更改为返回 Optional[[]]
【发布时间】: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&lt;Object&gt; 时,响应只是一个空列表,但optional.get() 仍然会抛出NoSuchElementException。我想避免这种情况。简而言之,如果没有找到完美的值,则从存储库中可选地获取单个实体会抛出 NoSuchElementException。但是对于空的实体列表的可选获取应该返回为空而不是抛出NoSuchElementException,因为它不是404错误。只是表示当前列表是空的。

【问题讨论】:

  • 你想要一个可选的集合吗?什么都没有发现列表是空的,Optional.empty()怎么更好?
  • @M.Deinum 我已经更新了我的要求。请看一下
  • 如果您不将列表包装在可选项中,您已经得到了。
  • @M.Deinum 正确。现在我面临代码标准的问题。在一种情况下(单个实体获取),我需要强制 Optional 为强制性,而在另一种情况下,永远不应允许 Optional。
  • 我有类似的使用场景,但我在 Spring Boot 2.4.02.4.10 中得到了 Optional.emptyOptional[[]]。真的很奇怪!

标签: java spring-boot spring-data-jpa optional


【解决方案1】:
 public Optional<List<PersonEntity>> findByStatus(int status);

没有意义。

正确的签名是

 List<PersonEntity> findByStatus(int status);

如果没有 PersonEntity,则列表将为空。

【讨论】:

  • 我想用 Optional 包装 List 以便默认处理 NPE。但是,如果 List 为空,我不希望 Optional 抛出 NoSuchElementException。
  • 我不明白?什么 NPE 和什么 NoSuchElementException?
  • 列表永远不会是null,如果没有,它将是一个空的List
  • @M.Deinum 这就是我在回答中写的。感谢您的强调!
  • 数字零也在许多课程中重复出现,一次又一次。那仍然不是“冗余代码”。
【解决方案2】:

我建议你停止思考技术导向,开始思考意义导向。

对于后者,我的意思是:查找函数的本质是:用户提供一个精确已知的标识符,结果预计最多,或者确切地说,一个实体是它与一个实体的根本不同。用户提供一些搜索条件并且可以返回任意数量的匹配实体的查找函数。

前者是return null;throw new NotFoundException();return Optional.ofNullable(null);逻辑需要

后者是没有逻辑需要的地方,因为数组和集合已经涵盖了从零到无穷大的所有可能数字......不管你可能有多少需要。

关注功能的本质比关注特定技术更重要。

编辑

如果您绝对想要(尽管提出了“为什么”的问题)两种查找函数的返回类型相同,那么 Collection<...> 是“正确”选项,具有在“单实体查找”场景中表示“未找到”的空集合。

【讨论】:

    【解决方案3】:

    你正在做不同的事情。

    Optional<List<PersonEntity>>
    

    表示它持有的值为empty

    我只能假设 Spring 做了类似的事情:

    if(list == null || list.isEmpty()) {
        return Optional.empty();
    }
    

    在第二种情况下,List&lt;PersonEntity&gt;empty 列表中的 Optional。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-09
      • 2019-11-15
      • 2022-11-23
      • 1970-01-01
      • 2019-07-20
      • 1970-01-01
      相关资源
      最近更新 更多