JpaRepository vs CRUDRepository findAll

Posted

技术标签:

【中文标题】JpaRepository vs CRUDRepository findAll【英文标题】: 【发布时间】:2015-10-31 03:19:38 【问题描述】:

我有一个简单的问题:为什么 JpaRepository 返回实体列表,而 CrudRepository 返回 Iterable 实体?

这是故意的吗?我想这是因为 CrudRepository 是更通用的接口,并且可能有一些特定的存储库返回 Iterable。

如果不使用特定的 JpaRepository,使用 CrudRepository 会变得更加困难..

谢谢

【问题讨论】:

我不明白为什么你能举个例子吗? 说,我想获取返回项目的大小,如果是 CrudRepository,我必须手动计数 while(hasnext) counter++,在列表上我可以简单地调用 size()。还有其他类似的东西。 【参考方案1】:

JpaRepository extends PagingAndSortingRepository

PagingAndSortingRepository extends CrudRepository

这允许JpaRepository 具有更具体的返回类型Itrable,即List

【讨论】:

谢谢,但这不是答案 :) 我知道它可以,我想知道为什么 =)【参考方案2】:

无论使用的实际数据存储如何,CrudRepository 类都是 Spring Data Commons project 和 is the recommended interface to extend 的一部分。

CrudRepository 方法返回 Iterable 而不是 List(或 Set)的原因是因为 some data stores allow streaming of results 和使用 Collection 类型会导致此类商店的功能丢失。

【讨论】:

是的,这似乎是我所期待的答案。你能举一个这样的商店的例子吗?之后我会接受答案。谢谢 查看我回答中的最后一个链接,其中 Spring Data 团队已经澄清了问题并给出了提供流支持的数据存储示例。 要解决您在问题中提到的问题,您可以随时联系interface BaseRepository<T, ID> extends CrudRepository<T, ID> @Override List<T> findAll(); 。这也是JpaRepository 所做的。这样,您可以坚持使用通用的 CrudRepository 并仍然获得您正在寻找的相同功能(Collection.size() 等)。 最后的评论太棒了,会尝试这样做,谢谢!

以上是关于JpaRepository vs CRUDRepository findAll的主要内容,如果未能解决你的问题,请参考以下文章

查询验证失败:JpaRepository

如何将对象从一个 JpaRepository 转换为另一个 JpaRepository

JpaRepository 上的@PreAuthorize

JpaRepository 查询参数未动态更新

JpaRepository,如何查询 OneToMany 单向字段?

JPARepository,名称方法返回包含“文本”的字段[关闭]