弹簧数据查找按返回类型

krm*_*007 5 java spring spring-data

弹簧数据findBy方法的可能返回类型是什么?我在任何地方都找不到任何合并列表。

像findByXXX可以返回

1) Entity
2) Optional<Entity>
3) List<Entity>
4) Stream<Entity>
Run Code Online (Sandbox Code Playgroud)

还有更多,但是我们有一个确定的清单吗?

另外,List<Entity>如果找不到数据,则返回emptyList,但是Stream<Entity>如果找不到数据,则返回null,因此在流上应用map / filter等时,会得到NPE。

除了在调用流函数之前物理检查null之外,是否有更好的方法使用Stream而不引起NPE。

rye*_*nus 5

虽然有点晚了,但支持的返回类型记录在此处:

\n\n

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repository-query-return-types

\n\n

一般来说,返回类型可以是以下任何类别:

\n\n
    \n
  1. (可选)单个项目,可以是原始、包装、对象或 void
  2. \n
  3. 项目的集合或分页列表
  4. \n
  5. 流、迭代器、Mono/Flux 或类似的。
  6. \n
  7. 未来,或其变体
  8. \n
\n\n

并且,当前支持的返回类型的完整列表:

\n\n
\n
    \n
  • 空白
  • \n
  • 基元
  • \n
  • 包装类型
  • \n
  • 时间
  • \n
  • 迭代器
  • \n
  • 收藏
  • \n
  • 列表
  • \n
  • 选修的
  • \n
  • 选项
  • \n
  • 溪流
  • \n
  • 可串流
  • \n
  • 实现\xc2\xa0Streamable\xc2\xa0并采用\xc2\xa0Streamable\xc2\xa0构造函数或工厂方法参数的类型
  • \n
  • Vavr\xc2\xa0Seq、\xc2\xa0List、\xc2\xa0Map、\xc2\xa0Set
  • \n
  • 未来
  • \n
  • 完整的未来
  • \n
  • 聆听未来
  • \n
  • \n
  • \n
  • 地理结果
  • \n
  • 地理结果
  • \n
  • 地理页面
  • \n
  • 单核细胞增多症
  • \n
  • 通量
  • \n
  • 单身的
  • \n
  • 或许
  • \n
  • 可流动的
  • \n
\n
\n


小智 4

您可能的返回类型列表是正确的。当您需要对结果进行分页时,您也可以使用PageSlice类型。参见示例:

\n\n
Page<User> findByLastname(String lastname, Pageable pageable);\n\nSlice<User> findByLastname(String lastname, Pageable pageable);\n
Run Code Online (Sandbox Code Playgroud)\n\n

“第一种方法允许您将 org.springframework.data.domain.Pageable 实例传递给查询方法,以动态地将分页添加到静态定义的查询中。Page 了解可用元素和页面的总数。它通过以下方式实现:基础设施触发计数查询来计算总数。由于根据所使用的存储,这可能会很昂贵,因此可以使用 Slice 作为返回。一个 Slice 只知道是否有\xe2\x80\x99s 下一个可用的 Slice,这可能是当步行思考更大的结果集时就足够了。” - 更多内容请参见:Spring Data 文档

\n\n

对于另一个问题,您可以使用 Guava/Java 8Optional。这样,您的查询方法将返回一个包含找到的对象的可选值或一个空的可选值。可选是一种用非空值替换可为空 T 引用的方法,请参见示例:

\n\n
Optional<User> findById(Long id);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我希望我对你有所帮助。=)

\n