findBy和findOneBy在春季数据JPA中的区别

到目前为止,我所知道的是FindBy可以返回多个结果,而FindOneBy将返回单个结果或null,当我们按照以下方式使用它时。

List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);

现在,我的问题是,我可以通过这种方式使用findBy吗?

Department  findByDepartmentId(Long Id);

如果是,

  • 让我们假设给定 Id 有多个记录。
  • findBydepartmentId 基于什么返回单个记录?

最后,何时或为什么我不应该使用findBy代替findOneBy?


答案 1

我可以用这种方式吗?部门findByfindByDepartmentId(Long Id);

是的,从Spring JPA的角度来看,这种语法在技术上是正确的。尽管Spring JPA通过查看返回类型来推断您试图通过查询实现的目标。

基本上,这些是返回类型的情况:

话虽如此,您的查询定义:

Department findByDepartmentId(Long Id);

表示您期望获得单个结果(因为您已指定为返回类型)。这将反映Spring JPA如何执行查询 - 它将在javax.persistence.Query接口上调用getSingleResult(),如果有多个对象满足条件,它将抛出一个。Entity Texception

返回单个记录的依据是什么?findBydepartmentId

基于存在具有该 Id 的单个对象,否则它将引发异常。

何时或为什么我不应该使用代替 ?findByfindOneBy

这两者具有不同的含义,不可互换。

findOneBy总是导致 getSingleResult() 被调用。

findBy根据返回类型具有不同的行为 - 根据上面给出的定义。


答案 2

findOneByXX将确保只有一个值或没有值,如果有 2 个值,则将引发异常。

但是,不会对唯一性进行此检查。findByXX


推荐