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

时间:2017-08-31 18:53:59

标签: java hibernate spring-boot spring-data-jpa jpa-2.0

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

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

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

Department  findByDepartmentId(Long Id);

如果是,

  • 假设给定Id有多个记录。
  • findBydepartmentId 以什么为基础返回单个记录?

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

3 个答案:

答案 0 :(得分: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具有不同的行为 - 根据上面给出的定义。

答案 1 :(得分:2)

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

findByXX并未对此进行唯一性检查。

答案 2 :(得分:2)

我已经进行了一些测试,并且Spring Data忽略了方法(finddelete,...)和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);