假设我有两个实体。
@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)
中固定方法来解决。但我想知道这一切的原因。
2条答案
按热度按时间tcomlyy61#
根据方法名称的性质,您要求Hibernate进行联接。当它从‘findByBarID’构建查询时,它从实体中的字段构建查询,实体foo中没有Barid字段,但有一个Map到Bar实体的Bar字段。
因此,即使foo表中有一个bar_id列,它也会执行连接,从而能够访问bar表中的列。把它看作是Get Me Foo Where ID in Bar?
这是必需的行为,因为您可能正在执行类似的方法调用,但在Bar中使用了一个名称字段,而在Foo表中显然没有‘name’列。帮我把酒吧里的名字放在哪里?
kx1ctssn2#
这是因为在Foo实体内部存在一对一的关系。默认情况下,一对一支持急切的获取/加载。这意味着JPA构造查询来获取匹配的实体,并且实体具有该实体的关系。