繁体   English   中英

findBy / findAllBy 之间的 Spring Data JPA 区别

[英]Spring Data JPA difference between findBy / findAllBy

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

List<SomeEntity> findBySomeCondition();

List<SomeEntity> findAllBySomeCondition();

不,它们之间没有区别,它们将执行完全相同的查询,当从方法名称派生查询时,Spring Data 会忽略All部分。 唯一重要的一点是By关键字,它后面的任何内容都被视为字段名称(除了像OrderBy这样的其他关键字, findAllByOrderByIdAsc会导致一些奇怪的方法名称,例如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 版本的博客文章中进行了解释:

春季数据的方法解析使用前缀关键字,比如findexistscount ,并delete和终止By关键字。 您在findBy之间放置的所有内容都会使您的方法名称更具表现力,并且不会影响查询派生。

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

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。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM