Spring 数据 JPA 中 findBy 和 findOneBy 的区别
Difference between findBy and findOneBy in Spring data JPA
目前我所知道的是 FindBy 可以 return 多个结果,而 FindOneBy 将 return 一个结果或 null 当我们按以下方式使用它时。
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
现在,我的问题是,我可以通过这种方式使用 findBy 吗?
Department findByDepartmentId(Long Id);
如果是,
- 假设给定 ID 有多个记录。
- findBydepartmentIdreturn单条记录的依据是什么?
最后,我什么时候或为什么不应该使用 findBy 代替 findOneBy?
findOneByXX
将确保只有一个值或没有值,如果有 2 个值将抛出异常。
但是 findByXX
不会进行唯一性检查。
Can I use findBy
this way? Department findByDepartmentId(Long Id)
;
是的,从 Spring JPA 的角度来看,此语法在技术上是正确的。尽管 Spring JPA 推断出您试图通过查看 return 类型 的查询来实现什么。
基本上这些是 return 类型的情况:
您的查询要 return 单个值 - 您可以指定 basic type
、Entity T
、Optional<T>
, CompletableFuture<T>
等
您的查询要 return T 的集合 - 您可以指定 List<T>
, Stream<T>
, Page<T>
, Slice<T>
等
也就是说,您的查询定义:
Department findByDepartmentId(Long Id);
表示您需要一个结果(因为您已将 Entity T
指定为 return 类型)。这将反映 Spring JPA 如何执行查询 - 它将调用 getSingleResult()
on the javax.persistence.Query
接口,如果多个对象满足条件,它将抛出 exception
。
On what basis does findBydepartmentId
return a single record?
前提是该Id只有一个对象,否则会抛出异常。
When or Why should i not use findBy
in place of findOneBy
?
两者含义不同,不可互换。
findOneBy
总是导致 getSingleResult()
被调用。
findBy
具有不同的行为,具体取决于 return 类型 - 根据上面给出的定义。
我做了一些测试 Spring 数据忽略了方法 (find
, delete
,...) 和 By
.[=16 之间的所有字符=]
Spring 数据仅使用 return 类型来决定如何处理响应。
因此即使在语义上不正确,也可以定义以下这些方法。
Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);
目前我所知道的是 FindBy 可以 return 多个结果,而 FindOneBy 将 return 一个结果或 null 当我们按以下方式使用它时。
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
现在,我的问题是,我可以通过这种方式使用 findBy 吗?
Department findByDepartmentId(Long Id);
如果是,
- 假设给定 ID 有多个记录。
- findBydepartmentIdreturn单条记录的依据是什么?
最后,我什么时候或为什么不应该使用 findBy 代替 findOneBy?
findOneByXX
将确保只有一个值或没有值,如果有 2 个值将抛出异常。
但是 findByXX
不会进行唯一性检查。
Can I use
findBy
this way? DepartmentfindByDepartmentId(Long Id)
;
是的,从 Spring JPA 的角度来看,此语法在技术上是正确的。尽管 Spring JPA 推断出您试图通过查看 return 类型 的查询来实现什么。
基本上这些是 return 类型的情况:
您的查询要 return 单个值 - 您可以指定
basic type
、Entity T
、Optional<T>
,CompletableFuture<T>
等您的查询要 return T 的集合 - 您可以指定
List<T>
,Stream<T>
,Page<T>
,Slice<T>
等
也就是说,您的查询定义:
Department findByDepartmentId(Long Id);
表示您需要一个结果(因为您已将 Entity T
指定为 return 类型)。这将反映 Spring JPA 如何执行查询 - 它将调用 getSingleResult()
on the javax.persistence.Query
接口,如果多个对象满足条件,它将抛出 exception
。
On what basis does
findBydepartmentId
return a single record?
前提是该Id只有一个对象,否则会抛出异常。
When or Why should i not use
findBy
in place offindOneBy
?
两者含义不同,不可互换。
findOneBy
总是导致 getSingleResult()
被调用。
findBy
具有不同的行为,具体取决于 return 类型 - 根据上面给出的定义。
我做了一些测试 Spring 数据忽略了方法 (find
, delete
,...) 和 By
.[=16 之间的所有字符=]
Spring 数据仅使用 return 类型来决定如何处理响应。
因此即使在语义上不正确,也可以定义以下这些方法。
Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);