Spring Data JPA中findBy和findOneBy的区别

36

我所知道的是,FindBy可以返回多个结果,而FindByOne则会在以下方式使用时返回单个结果或null。

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

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

Department  findByDepartmentId(Long Id);

如果是的话,

  • 假设给定Id有多个记录。
  • findBydepartmentId 根据什么基准返回单个记录?

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


我有同样的问题,你是否找到了答案? - Doug
3个回答

28
我能这样使用findBy吗? Department findByDepartmentId(Long Id);
是的,从Spring JPA的角度来看,这种语法在技术上是正确的。尽管Spring JPA也会根据返回类型推断你试图实现什么样的查询。
基本上,这些是返回类型的情况:

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

Department findByDepartmentId(Long Id);

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

findBydepartmentId基于什么返回单个记录?

基于该ID只有一个对象,否则它将抛出异常。

什么时候或为什么我不应该使用findBy代替findOneBy

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

findOneBy总是调用getSingleResult()

findBy的行为取决于返回类型的不同 - 如上所述。


9

findOneByXX会确保只有一个或零个值,如果有两个值,则会抛出异常。

然而,findByXX不会检查唯一性。


2
使用自定义的@Query时,Optional<X> findBy返回IncorrectResultSizeDataAccessException。 - Whimusical
根据声明的结果类型,findByXX可能会抛出此异常。实体T或Optional<T>仍将导致调用getSingleResult(),如果有多个记录符合条件,则会抛出IncorrectResultSizeDataAccessException异常。 - hovanessyan

6
我进行了一些测试,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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接