繁体   English   中英

Spring数据JPA中findBy和findOneBy的区别

[英]Difference between findBy and findOneBy in Spring data JPA

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

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

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

Department  findByDepartmentId(Long Id);

如果是,

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

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

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

是的,从 Spring JPA 的角度来看,这种语法在技术上是正确的。 尽管 Spring JPA 也会通过查看返回类型的查询来推断您要实现的目标。

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

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

Department findByDepartmentId(Long Id);

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

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

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

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

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

findOneBy总是导致调用getSingleResult()

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM