到目前为止,我所知道的是FindBy可以返回多个结果,而FindOneBy将返回单个结果,或者当我们以下列方式使用它时为null。
List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
现在,我的问题是,我可以这样使用findBy吗?
Department findByDepartmentId(Long Id);
如果是,
最后,何时或为什么不使用findBy代替findOneBy?
答案 0 :(得分:11)
我可以这样使用
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如何执行查询 - 它将在getSingleResult()
接口上调用javax.persistence.Query
,如果多个对象满足条件,则会抛出exception
。
findBydepartmentId
以什么为基础返回单个记录?
基于具有该Id的单个对象,否则将引发异常。
何时或为何不使用
findBy
代替findOneBy
?
这两者具有不同的含义,不可互换。
findOneBy
始终会导致getSingleResult()
被调用。
findBy
具有不同的行为 - 根据上面给出的定义。
答案 1 :(得分:2)
findOneByXX
将确保只有一个值或没有值,如果有2个值将抛出异常。
但findByXX
并未对此进行唯一性检查。
答案 2 :(得分:2)
我已经进行了一些测试,并且Spring Data忽略了方法(find
,delete
,...)和By
之间的所有字符。
Spring Data仅使用返回类型来决定如何处理响应。
因此,即使语义上不正确,也可以定义以下方法。
Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);