Spring数据JPA中findBy和findOneBy之间的区别

问题描述 投票:12回答:2

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

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

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

Department  findByDepartmentId(Long Id);

如是,

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

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

java hibernate spring-boot spring-data-jpa jpa-2.0
2个回答
11
投票

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

是的,从Spring JPA的角度来看,这种语法在技术上是正确的。虽然Spring JPA也会通过查询返回类型来推断您尝试实现的内容。

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

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

Department findByDepartmentId(Long Id);

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

findBydepartmentId以什么为基础返回单一记录?

在有一个具有该Id的单个对象的基础上,否则它将抛出异常。

何时或为什么我不使用findBy代替findOneBy

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

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

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


2
投票

findOneByXX将确保只有一个值或没有值,如果有2个值将抛出异常。

然而,findByXX没有对这种独特性进行检查。

© www.soinside.com 2019 - 2024. All rights reserved.