2016-10-20 2 views
1

Предположим, у меня есть эта таблица service_providers, у которой есть собственная ссылка через столбец enterprise_id.Внутреннее соединение querydsl с предложением where

id   enterprise_id 

102   57 
103   57 



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

Что я пытаюсь сделать с помощью enterprise_id получить все servive_providers. Это довольно легко в SQL:

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

Но при попытке повторить, что с помощью запроса-DSL я как-то попасть в проблемы.

Вот что выглядит следующим образом:

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); 

Это то, что спящий режим генерирует:

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=? 

Это немного сбивает с толку, кроме того, что неправильно.

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

ответ

0

В принципе, с помощью ребят на самых querydsl форумах, вот важные биты здесь: Pure 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

что ** ** может быть недействительна, если enterprise_id где-то я мог бы получить доступ, thatsa JoinColumn, как вы можете видеть. – Eugene