Spring 数据 JPA 中 findBy 和 findOneBy 的区别

Difference between findBy and findOneBy in Spring data JPA

目前我所知道的是 FindBy 可以 return 多个结果,而 FindOneBy 将 return 一个结果或 null 当我们按以下方式使用它时。

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

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

Department  findByDepartmentId(Long Id);

如果是,

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

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

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

Can I use findBy this way? Department findByDepartmentId(Long Id);

是的,从 Spring JPA 的角度来看,此语法在技术上是正确的。尽管 Spring JPA 推断出您试图通过查看 return 类型 的查询来实现什么。

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

也就是说,您的查询定义:

Department findByDepartmentId(Long Id);

表示您需要一个结果(因为您已将 Entity T 指定为 return 类型)。这将反映 Spring JPA 如何执行查询 - 它将调用 getSingleResult() on the javax.persistence.Query 接口,如果多个对象满足条件,它将抛出 exception

On what basis does findBydepartmentId return a single record?

前提是该Id只有一个对象,否则会抛出异常。

When or Why should i not use findBy in place of findOneBy?

两者含义不同,不可互换。

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

findBy 具有不同的行为,具体取决于 return 类型 - 根据上面给出的定义。

我做了一些测试 Spring 数据忽略了方法 (find, delete,...) 和 By.[=16 之间的所有字符=]

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 数据仅使用 return 类型来决定如何处理响应。

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

Department findAllByDepartmentId(Long Id);
List<Department> findOneByDepartmentName(String name);