Spring Data JPA的区别 findBy / findAllBy

2022-08-31 10:15:40

使用Spring Data JPA关键字时,以下两者之间有什么区别吗:

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

答案 1

不,它们之间没有区别,它们将执行完全相同的查询,从方法名称派生查询时,Spring Data会忽略该部分。唯一重要的一点是关键字,它后面的任何内容都被视为字段名称(除了其他关键字,例如偶然地可能导致一些奇怪的方法名称,例如)。AllByOrderByfindAllByOrderByIdAsc

这意味着这样的东西是完全有效的:

List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();

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

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

Spring Data 2.3.6 版本的文档讨论了此功能:

并且(或其他引入关键字)之间的任何文本都被认为是描述性的,除非使用结果限制关键字之一,例如a在要创建的查询上设置不同的标志或/来限制查询结果。findByDistinctTopFirst

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

Spring Data的解析方法使用前缀关键字,如、、和终止关键字。您放在两者之间的所有内容都会使您的方法名称更具表现力,并且不会影响查询派生。findexistscountdeleteByfindBy


答案 2

为了说明其中的区别,让我们看一下这两个函数:

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

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


推荐