Spring Data JPA findBy / findAllBy 之间的区别

新手上路,请多包涵

在以下之间使用 Spring Data JPA 关键字时是否有任何区别:

 List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

原文由 Nikita 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.7k
2 个回答

不,它们之间没有区别,它们将执行完全相同的查询, All 部分在从方法名称派生查询时被 Spring Data 忽略。唯一重要的一点是 By 关键字,它后面的任何内容都被视为字段名称(其他关键字除外 OrderBy 顺便说一句,它可能会导致一些看起来很奇怪的方法名称,例如 findAllByOrderByIdAsc )。

这意味着这样的事情是完全有效的:

 List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();

并将执行与以下完全相同的 SQL 查询:

 List<SomeEntity> findBySomeCondition();

或者

List<SomeEntity> findAllBySomeCondition();

Spring Data 2.3.6 版本的 文档 讨论了这个特性:

find (或其他引入关键字)和 By 之间的任何文本都被认为是描述性的,除非使用结果限制关键字之一,例如 Distinct 要创建的查询上的不同标志或 Top / First 以限制查询结果。

该功能的目的在一篇关于即将发布的 Spring Data 2.0 版本的 博客文章 中进行了解释:

Spring Data’s method parsing uses prefix keywords like find , exists , count , and delete and a terminating By 关键词。您放在 findBy 之间的所有内容都会使您的方法名称更具表现力,并且不会影响查询派生。

原文由 Robert Hunt 发布,翻译遵循 CC BY-SA 4.0 许可协议

为了说明差异,让我们看一下这两个函数:

 1. Set<Policy> findAllByRoleIn(Iterable<Role> role);

2. Set<Policy> findByRoleIn(Iterable<Role> role);

第一个函数生成的查询:

 1.  select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))

第二个函数生成的查询:

 2. select policy.id, policy.role from policy where (policy.role in (? , ? , ? , ?))

结论:很明显,如果我们查看这两个函数生成的查询。我们可以清楚地看到,两个函数定义之间没有区别,它们执行完全相同的查询。

原文由 Zahid Khan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题