Spring Data JPA 之间 findBy / findAllBy 的区别

Posted

技术标签:

【中文标题】Spring Data JPA 之间 findBy / findAllBy 的区别【英文标题】:Spring Data JPA difference between findBy / findAllBy 【发布时间】:2016-09-12 05:20:20 【问题描述】:

在使用Spring Data JPA关键字时有什么区别:

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

【问题讨论】:

【参考方案1】:

如果我们想按名称或其他条件(如findByFirstName(String firstName);)查找,则使用findBy 方法

findAll 方法一般通过提供规范来查找

List<T> findAll(Specification<T> spec);

请参阅下面的文档以获得更清晰的信息:

http://docs.spring.io/spring-data/jpa/docs/1.4.3.RELEASE/reference/html/jpa.repositories.html

【讨论】:

不,你写的那个方法来自 JPASpecificationExecutor。我说的只是 JpaRepository。我可以创建方法 findAllByFirstName(String firstName),它的工作方式类似于 findByFirstName。在这个问题中,我试图了解它们之间的区别。【参考方案2】:

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

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

List<SomeEntity> findAnythingYouWantToPutHereBySomeCondition();

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

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

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

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

在blog post 中解释了该功能的目的,关于即将发布的 Spring Data 2.0 版本:

Spring Data 的方法解析使用前缀关键字,如 findexistscountdelete,以及终止关键字 By。您在findBy 之间添加的所有内容都会使您的方法名称更具表现力,并且不会影响查询派生。

【讨论】:

感谢您的描述 感谢您指定 OrderBy 定义,说明在 OrderBy 之前需要 By 是否有关于查询创建(包括修改)的完整文档?我只能找到片段(例如docs.spring.io/spring-data/jpa/docs/current/reference/html/… - 没有关于..all..的消息,删除..) 那它为什么还在呢? 我也找不到文档中定义的前缀命名行为,但是当包含在前缀中时,改变行为:术语“Distinct ",例如"findDistinctBySomeCondition(): 4.4.2. Query Creation【参考方案3】:

一个区别是使用 findAllBy Hibernate 过滤器(来自 org.hibernate.annotations 的@Filters),因此使用了不同的 sql。

【讨论】:

【参考方案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 (? , ? , ? , ?))

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

【讨论】:

以上是关于Spring Data JPA 之间 findBy / findAllBy 的区别的主要内容,如果未能解决你的问题,请参考以下文章

spring data jpa getOne抛出LazyInitializationException而findBy没有

spring data jpa getOne 抛出 LazyInitializationException 和 findBy 不

spring data jpa 创建方法名进行简单查询

学习-spring data jpa

Spring数据JPA中findBy和findOneBy的区别

如何忽略 Spring JPA findBy 存储库中的重音符号?