在使用Spring Data JPA关键字时,使用以下两种方式有什么区别:
List<SomeEntity> findBySomeCondition();
和
List<SomeEntity> findAllBySomeCondition();
在使用Spring Data JPA关键字时,使用以下两种方式有什么区别:
List<SomeEntity> findBySomeCondition();
和
List<SomeEntity> findAllBySomeCondition();
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
。在find
和By
之间放置的任何内容都可以使您的方法名称更具表现力,并且不会影响查询派生。
为了说明差异,让我们看一下这两个函数:
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 (? , ? , ? , ?))
结论:显然,如果我们查看两个函数生成的查询,我们可以清楚地看到,两个函数定义之间没有任何区别,它们执行完全相同的查询。
一个区别是,使用findAllBy时,会应用Hibernate过滤器(来自org.hibernate.annotations的@Filters),因此会生成不同的SQL语句。
实际上,findAllBy和findBy之间的区别在于: findAllBy返回一个集合,而 findBy返回一个Optional。
因此,最好写List findAllBy而不是写List findBy(但它也可以工作:p)。 并且写Optional findBy而不是Optional findAllBy。
请查看此文档https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.core-concepts
如果我们想要按名称或其他标准查找,就会使用findBy方法,例如findByFirstName(String firstName);
通常通过提供规范来查找所有方法
List<T> findAll(Specification<T> spec);
http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html
findDistinctBySomeCondition()
":4.4.2. Query Creation。 - M. Justin