2014-02-26 119 views
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=? 

任何想法爲什麼會發生這種情況,以及如何避免它?

回答

1

您需要創建一個別名,以確保在其中部分

QProject project = QProject.project; 
QPerson owner = new QPerson("owner"); 
List<Project> projects = from(project) 
    .leftJoin(project.owner, owner).fetch() 
    .where(owner.name.eq(name)) 
    .list(project); 
+0

感謝蒂莫第一聯接被重用!現在它按預期工作 – codependent