2014-02-26 123 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