[英]Difference between findBy and findOneBy in Spring data JPA
到目前为止我所知道的是 FindBy 可以返回多个结果,而 FindOneBy 将返回单个结果或 null 当我们以下列方式使用它时。
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
现在,我的问题是,我可以这样使用 findBy 吗?
Department findByDepartmentId(Long Id);
如果是,
最后,何时或为什么不应该使用 findBy 代替 findOneBy?
我可以这样使用
findBy
吗? 部门findByDepartmentId(Long Id)
;
是的,从 Spring JPA 的角度来看,这种语法在技术上是正确的。 尽管 Spring JPA 也会通过查看返回类型的查询来推断您要实现的目标。
基本上这些是返回类型的情况:
对于您想要返回单个值的查询 - 您可以指定basic type
、 Entity T
、 Optional<T>
、 CompletableFuture<T>
等。
对于您想要返回 T 集合的查询 - 您可以指定List<T>
、 Stream<T>
、 Page<T>
、 Slice<T>
等。
话虽如此,您的查询定义:
Department findByDepartmentId(Long Id);
意味着您期望一个结果(因为您已将Entity T
指定为返回类型)。 这将反映 Spring JPA 如何执行查询 - 它将调用javax.persistence.Query
接口上的getSingleResult()
,如果多个对象满足条件,它将抛出exception
。
findBydepartmentId
在什么基础上返回单个记录?
基于有一个具有该 Id 的对象,否则它将抛出异常。
何时或为什么不应该使用
findBy
代替findOneBy
?
两者含义不同,不可互换。
findOneBy
总是导致调用getSingleResult()
。
findBy
根据返回类型具有不同的行为 - 根据上面给出的定义。
findOneByXX
将确保只有一个值或没有值,如果有 2 个值将抛出异常。
但是findByXX
不会进行这种唯一性检查。
我做了一些测试,Spring Data 忽略了方法( find
、 delete
、...)和By
之间的所有字符。
Spring Data 仅使用返回类型来决定如何处理响应。
因此,即使在语义上不正确,也可以定义以下这些方法。
Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.