1
我所遇到的一个奇怪的行为,当使用QueryDSL集成与Spring数据JPA:春数据JPA + QueryDSL查询优化
我有项目和人之间的关系多对一。如果我得到所有者ID的所有属于用户项目(外键)一切正常:
QProject project = QProject.project;
QPerson owner = project.owner;
List<Project> projects = from(project).leftJoin(owner).fetch()
.where(owner.id.eq(id)).list(project);
生成的查询:
select
project0_.id as id1_1_0_,
person1_.id as id1_0_1_,
project0_.creation_date as creation2_1_0_,
project0_.name as name3_1_0_,
project0_.owner as owner4_1_0_,
person1_.name as name2_0_1_
from
project project0_
left outer join
person person1_
on project0_.owner=person1_.id
where
project0_.owner=?
然而,假设我们希望获得所有项目由字段不是外键(例如所有者的名称)属于一个人:
QProject project = QProject.project;
QPerson owner = project.owner;
List<Project> projects = from(project).leftJoin(owner).fetch()
.where(owner.name.eq(name)).list(project);
在这种情况下,该表人是加入不必要的两倍(通知person1_和person2_):
select
project0_.id as id1_1_0_,
person1_.id as id1_0_1_,
project0_.creation_date as creation2_1_0_,
project0_.name as name3_1_0_,
project0_.owner as owner4_1_0_,
person1_.name as name2_0_1_
from
project project0_
left outer join
person person1_
on project0_.owner=person1_.id cross
join
person person2_
where
project0_.owner=person2_.id
and person2_.name=?
任何想法为什么会发生这种情况,以及如何避免它?
感谢蒂莫第一联接被重用!现在它按预期工作 – codependent