Java (弹簧护套)can可选<&燃气轮机;类与列表类似<&燃气轮机;上课?

Java (弹簧护套)can可选<&燃气轮机;类与列表类似<&燃气轮机;上课?,java,list,spring-boot,optional,Java,List,Spring Boot,Optional,我试图将RoomEntity类作为其泛型参数放在列表中,但列表类变为红色(错误),它建议我将列表类更改为可选类 public interface RoomRepository extends CrudRepository<RoomEntity, Long> { List<RoomEntity> findById(Long id); } 它们是一样的吗 List<RoomEntity> findById(Long id); Optional<R

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

public interface RoomRepository extends CrudRepository<RoomEntity, Long> {
    List<RoomEntity> findById(Long id);
}
它们是一样的吗

List<RoomEntity> findById(Long id); 
Optional<RoomEntity> findById(Long id);
List findById(长id);
可选的findById(长id);

findById方法应该根据其id查找单个实体。毕竟,每个实体的id都是唯一的

您可以尝试使用
findAllById
, 但我怀疑这会有多大不同


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

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

您可以尝试使用
findAllById
, 但我怀疑这会有多大不同


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

根据定义,您的
findById
应始终返回1或0个实体(根据for spring数据方法命名),因为您的
id
是唯一的键,并且存储库中不能有多个具有该键值的条目。因此,
可选的
非常适合这种情况,因为它要么是
空的
(存储库中没有带有这样的键的条目),要么是
显示有特定值的
(存储库中有条目)。如果您想通过一些非唯一键来查询所有实体,比如说
name
列,那么您可以将方法命名为
findByName
,返回值为
Iterable
,这样,在为存储库生成实现时,spring将理解结果集中可以有多个实体

方法
findById
已经在您要扩展的接口中,所以您无法更改它的返回类型


这也可能有用:

您的
findById
根据定义应始终返回1或0个实体(根据for spring数据方法命名),因为您的
id
是唯一的键,并且存储库中不能有多个条目具有这样的键值。因此,
可选的
非常适合这种情况,因为它要么是
空的
(存储库中没有带有这样的键的条目),要么是
显示有特定值的
(存储库中有条目)。如果您想通过一些非唯一键来查询所有实体,比如说
name
列,那么您可以将方法命名为
findByName
,返回值为
Iterable
,这样,在为存储库生成实现时,spring将理解结果集中可以有多个实体

方法
findById
已经在您要扩展的接口中,所以您无法更改它的返回类型


这也可能有用:

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

如果您请求一个
列表
,Spring将初始化一个列表,并将任何行数据添加到该列表中,然后返回给您。因此,它将:

  • 如果未找到项目,则返回空列表
  • 如果找到项目,则返回填充的列表
  • 当您询问一个
    可选的
    时,Spring会理解您最多需要一行数据。它将在
    javax.persistence.Query
    上解释为
    getSingleResult()。因此,它将:

  • 如果未找到项目,则返回
    可选的.empty()

  • 如果恰好有一个匹配项,则返回(结果)的
    Optional.of

  • 如果存在多个匹配项,则抛出异常(我记得的是
    ununiqueresultexception
  • 在您的情况下,您可以通过
    id
    查找。它在您的桌子上是独一无二的,因此
    可选
    应该适合您的用途


    但是请注意,您的
    列表findById(长id)定义是正确的,它不会给您编译器错误(变为红色)。您是否导入了
    列表
    界面?

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

    如果您请求一个
    列表
    ,Spring将初始化一个列表,并将任何行数据添加到该列表中,然后返回给您。因此,它将:

  • 如果未找到项目,则返回空列表
  • 如果找到项目,则返回填充的列表
  • 当您询问一个
    可选的
    时,Spring会理解您最多需要一行数据。它将在
    javax.persistence.Query
    上解释为
    getSingleResult()。因此,它将:

  • 如果未找到项目,则返回
    可选的.empty()

  • 如果恰好有一个匹配项,则返回(结果)的
    Optional.of

  • 如果存在多个匹配项,则抛出异常(我记得的是
    ununiqueresultexception
  • 在您的情况下,您可以通过
    id
    查找。它在您的桌子上是独一无二的,因此
    可选
    应该适合您的用途


    但是请注意,您的
    列表findById(长id)定义是正确的,它不会给您编译器错误(变为红色)。您是否导入了
    列表
    界面?

    可选和列表是两个截然不同的概念

    findAllById方法返回一个Iterable。 findById方法返回一个可选值

    iterable可用于逐个访问集合的元素,因此可与List类结合使用

    可选的是容器对象,它可能包含也可能不包含非空值(零或一个元素)。这将有一个单一的元素,而不是像列表中那样多的元素(如果有)

    Crudepository::findAllById可以向其发送多个ID,因此可以返回多个元素,其方法是返回一个iterable,您可以使用它逐个选择每个返回的结果。findById方法只能发送一个ID,因此如果元素存在,则返回该元素(包装为可选的)
    List<RoomEntity> findById(Long id); 
    Optional<RoomEntity> findById(Long id);