Spring Data JPA中findBy和findAllBy的区别

117

在使用Spring Data JPA关键字时,使用以下两种方式有什么区别:

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();
5个回答

195
不,它们之间没有区别,它们将执行完全相同的查询,当Spring Data从方法名称推导出查询时,All部分将被忽略。唯一重要的部分是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的方法解析使用前缀关键字,例如find, exists, count, 和 delete,以及一个终止关键字By。在 findBy 之间放置的任何内容都可以使您的方法名称更具表现力,并且不会影响查询派生。


感谢您的描述。 - Nikita
感谢您明确指定了OrderBy的定义,表明在OrderBy之前需要加上By。 - Sylvester
有没有关于查询创建(包括修改)的完整文档?我只能找到一些片段(例如https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-methods.query-creation - 没有提到..all..,remove..)。 - Ekaterina
我在文档中也找不到前缀命名行为的定义,但有一件事情将会更改前缀行为:在前缀中加入"Distinct"这个词,例如"findDistinctBySomeCondition()":4.4.2. Query Creation - M. Justin
虽然在技术上没有区别,但我认为使用“by”过滤结果的方法不应该被命名为“findAll”,因为它并不能找到所有条目。 - Datz
显示剩余3条评论

4

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

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 (? , ? , ? , ?))

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


0

一个区别是,使用findAllBy时,会应用Hibernate过滤器(来自org.hibernate.annotations的@Filters),因此会生成不同的SQL语句。


0

1
不,findBy 可以返回一个列表。 - Mert

-5

不,你所写的方法来自JPASpecificationExecutor。我说的是JpaRepository。我可以创建一个名为findAllByFirstName(String firstName)的方法,它将类似于findByFirstName。在这个问题中,我试图理解它们之间的区别。 - Nikita

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接