2016-10-20 5 views
1

enterprise_id 열을 통해 자체 참조가있는이 테이블 service_providers가 있다고 가정합니다.내부 조인 querydsl with where 문

id   enterprise_id 

102   57 
103   57 



    public class ServiceProvider { 
     .... 
     @ManyToOne 
     @JoinColumn(name = "enterprise_id") 
     private ServiceProvider enterprise; 
} 

나는 enterprise_id를 갖는 모든 servive_providers를 갖기 위해 노력하고 있습니다. 이것은 매우 간단합니다 :

select sp1.id 
    from service_providers sp1 
    inner join service_providers sp2 on (sp1.enterprise_id=sp2.id) 
    where sp2.id=57; 

그러나 쿼리 - dsl을 통해 복제하려고하면 어떻게 든 문제가됩니다.

select sp1.id 
from service_providers sp0 
cross join service_providers sp1 
inner join service_providers sp2 on (sp1.enterprise_id=sp2.id) 
where sp0.id=? and sp2.id=? 

이 잘못되고 게다가, 약간의 혼란이 최대 절전 모드가 생성하는 것입니다

QServiceProvider serviceProvider2 = new QServiceProvider("serviceProvider2"); 
    QServiceProvider serviceProvider3 = new QServiceProvider("serviceProvider3"); 



    query.from(serviceProvider2) 
      .innerJoin(serviceProvider3) 
      .on(serviceProvider2.enterprise.id.eq(serviceProvider3.id)) 
      .where(serviceProvider3.id.eq(enterpriseId)) 
      .list(serviceProvider2.id); 

:처럼 여기

입니다 어떤 것은 보인다.

아무도 내가 여기서 뭘 잘못하고 있다고 말할 수 있습니까?

답변

0

기본적으로 querydsl 포럼에서 사람의 도움으로, 여기에 중요한 비트 현재 위치 : 순수한 JPA의 방법은 조인에서 "연결 경로"를 사용하는 것, 내가 사용하는 "루트 개체입니다 "JPA 2.1 스펙에 의해 허용되지 않는

올바른 쿼리는 다음과 같을 것이다 :

query.from(serviceProvider2) 
      .innerJoin(serviceProvider2.enterprise, serviceProvider3) 
      .where(serviceProvider3.id.eq(enterpriseId)) 
      .list(serviceProvider2.id); 
0

이 시도 :

query.from(serviceProvider2) 
      .innerJoin(serviceProvider3) 
      .on(serviceProvider2.enterprise.id.eq(serviceProvider3.id)) 
      .where(serviceProvider3.enterprise_id.eq(enterpriseId)) 
      .list(serviceProvider2.id); 

당신은 ID 대신 enterprise_id하여 어디를하고 있습니다.

.where(serviceProvider3.id.eq(enterpriseId)) 
+0

그 ** 수 ** 당신이 할 수 JoinColumn thatsa, 내가 액세스 할 수있는 곳 뭔가 enterprise_id 경우 유효 만나다. – Eugene