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