到目前为止,我所知道的是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>
等。List<T>
,Stream<T>
,Page<T>
,Slice<T>
等。话虽如此,您的查询定义:
Department findByDepartmentId(Long Id);
表示您期望单个结果(因为您已将Entity T
指定为返回类型)。这将反映Spring JPA如何执行查询 - 它将在getSingleResult()
接口上调用javax.persistence.Query
,如果多个对象满足条件,则会抛出exception
。
findBydepartmentId
以什么为基础返回单一记录?
在有一个具有该Id的单个对象的基础上,否则它将抛出异常。
何时或为什么我不使用
findBy
代替findOneBy
?
这两者具有不同的含义,不可互换。
findOneBy
总是导致getSingleResult()
被调用。
根据返回类型,findBy
具有不同的行为 - 根据上面给出的定义。
findOneByXX
将确保只有一个值或没有值,如果有2个值将抛出异常。
然而,findByXX
没有对这种独特性进行检查。