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

Aru*_*wda 16 java hibernate jpa-2.0 spring-data-jpa spring-boot

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

List<Department> findByDepartmentName(String name);
Department findOneByDepartmentId(Long Id);
Run Code Online (Sandbox Code Playgroud)

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

Department  findByDepartmentId(Long Id);
Run Code Online (Sandbox Code Playgroud)

如是,

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

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

hov*_*yan 15

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

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

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

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

Department findByDepartmentId(Long Id);
Run Code Online (Sandbox Code Playgroud)

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

在什么基础上exception返回单个记录?

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

什么时候或为什么不用findBydepartmentId代替findBy

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

findOneBy总是导致findOneBy被调用.

getSingleResult() 根据返回类型有不同的行为 - 根据上面给出的定义.


小智 7

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

但是findByXX,不会进行这种唯一性检查。

  • 至少在使用自定义 @Query 时,Optional&lt;X&gt; findBy 返回 In CorrectResultSizeDataAccessException (2认同)

小智 7

我做了一些测试,Spring Data 忽略了方法 ( find, delete,...) 和之间的所有字符By

https://github.com/spring-projects/spring-data-commons/blob/14d5747f68737bb44441dc511cf16393d9d85dc8/src/main/java/org/springframework/data/repository/query/parser/PartTree.java#L65中,它是\p{Lu}.*?部分。

Spring Data 仅使用返回类型来决定如何处理响应。

因此,即使语义上不正确,也可以定义以下这些方法。

Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);
Run Code Online (Sandbox Code Playgroud)