繁体   English   中英

(Spring boot) Optional<> Class 可以像 List<> Class 吗?

[英](Spring boot) can Optional<> Class be like List<> Class?

我试图将 RoomEntity 类放在列表中作为其通用参数,但列表类变为红色(错误),它建议我将列表类更改为可选类。

public interface RoomRepository extends CrudRepository<RoomEntity, Long> {
    List<RoomEntity> findById(Long id);
}

房间实体类

@Entity
@Table(name = "Room")
public class RoomEntity {

}

他们是一样的吗?

List<RoomEntity> findById(Long id); 
Optional<RoomEntity> findById(Long id);

Spring data JPA 将使查询结果适合您所需的容器

您询问List<> ,Spring 将初始化一个列表并将任何行数据添加到该列表并为您返回。 因此它将:

  1. 如果没有找到项目,则返回空列表
  2. 如果找到项目,则返回填充列表

当您询问Optional<> ,Spring 会理解您最多需要一行数据。 它将解释为javax.persistence.Query上的getSingleResult() 因此它将:

  1. 如果没有找到项目,则返回Optional.empty()

  2. 如果完全匹配,则返回Optional.of(result)

  3. 如果有多个匹配项,则抛出异常(我记得的是NonUniqueResultException

在您的情况下,您可以通过id找到。 它在你的桌子上是独一无二的,所以Optional<>应该适合你的目的。

但请注意,您的List<RoomEntity> findById(Long id); 定义是正确的,它不会给你编译错误(变成红色)。 你有没有导入List界面?

Optional 和 List 是两个截然不同的概念。

CrudRepository findAllById 方法返回一个 Iterable。 findById 方法返回一个 Optional。

可迭代对象可用于一个一个访问集合的元素,因此可以与 List 类结合使用。

Optional 是一个容器对象,它可能包含也可能不包含非空值(零或一个元素)。 这将有一个元素,而不是像 List 中的很多元素,如果有的话。

CrudRepository::findAllById 可以有多个 ID 发送给它,因此可以返回多个元素,它这样做的方式是返回一个可迭代对象,您可以使用它来逐个选择每个返回的结果。 findById 方法只能发送一个 ID,因此如果该元素存在(包装在 Optional 中),则返回该元素,否则返回 Optional.none。

如果您正在寻找要返回的列表,因为您打算发送多个 ID,请使用 findAllById 方法。 如果您只需要 ID 的特定元素,则使用 findById 方法,但是您必须先解开它返回的 Optional 对象,然后才能使用 Optional.get、Optional.isPresent 或使用它在流管道之外使用它在流管道中对其进行 map 或 flatmap 调用。

findById 方法应该通过它的 id 查找单个实体。 毕竟,每个实体的 id 都是唯一的。

您可以尝试使用findAllById ,但我怀疑它会产生很大的不同。

Optional 的意思是可能有也可能没有结果。 Optional 的isPresent方法将表明这一点。

根据定义,您的findById应始终返回 1 或 0 个实体(根据 spring 数据方法命名的文档),因为您的id是唯一键,并且您的存储库中不能有多个具有此类键值的条目。 所以Optional西服非常清楚这种情况,因为它无论是empty或(在仓库等重要的条目) present与特定值(有在库条目)。 如果你想通过一些不唯一的键查询所有实体,比如name列,你可以命名你的方法findByName ,返回值Iterable<Entity> ,因此在为你的存储库生成实现时,spring 会明白可以有多个结果集中有 1 个实体。

方法findById已经在您要扩展的接口中预定义,因此无论如何您都无法更改它的返回类型。

这也可能有用: https : //docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM