为什么Spring data JPA‘findByEntityId’使用Join操作进行查询?

bogh5gae  于 2022-09-18  发布在  Spring
关注(0)|答案(2)|浏览(200)

假设我有两个实体。

@Entity
public class Foo {

    @Id (...)
    private Long id;

    @OneToOne(...)
    private Bar bar;

    // and other fields
}
@Entity
public class Bar {

    @Id(...)
    private Long id;

    // and other fields
}

当我创建方法FooRepository#findByBarId(Long barId)时,由Spring data JPA创建的SQL如下

select ... 
from foo 
   left outer join bar where foo.id = bar.id 
where bar.id = ?

我预计这将被描述如下。

select ...
from foo
where foo.bar_id = ?

我知道这可以通过在FooRepository#findByBar(Bar bar)中固定方法来解决。但我想知道这一切的原因。

tcomlyy6

tcomlyy61#

根据方法名称的性质,您要求Hibernate进行联接。当它从‘findByBarID’构建查询时,它从实体中的字段构建查询,实体foo中没有Barid字段,但有一个Map到Bar实体的Bar字段。

因此,即使foo表中有一个bar_id列,它也会执行连接,从而能够访问bar表中的列。把它看作是Get Me Foo Where ID in Bar?

这是必需的行为,因为您可能正在执行类似的方法调用,但在Bar中使用了一个名称字段,而在Foo表中显然没有‘name’列。帮我把酒吧里的名字放在哪里?

findByBarName
kx1ctssn

kx1ctssn2#

这是因为在Foo实体内部存在一对一的关系。默认情况下,一对一支持急切的获取/加载。这意味着JPA构造查询来获取匹配的实体,并且实体具有该实体的关系。

相关问题