[英](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 将初始化一个列表并将任何行数据添加到该列表并为您返回。 因此它将:
当您询问Optional<>
,Spring 会理解您最多需要一行数据。 它将解释为javax.persistence.Query
上的getSingleResult()
。 因此它将:
如果没有找到项目,则返回Optional.empty()
如果完全匹配,则返回Optional.of(result)
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.