2014-02-26 4 views
1

사용 QueryDSL 스프링 데이터 JPA와 통합 할 때 나는 이상한 행동을 가로 질러 온 :스프링 데이터 JPA + QueryDSL 쿼리 최적화

내가 프로젝트와 사람 사이에 ManyToOne 관계를 가지고있다. 내가 소유자 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