2015-02-04 13 views
5

Załóżmy, że mam dwie tabele Task i Company. Company ma kolumny id i name. Task ma dwie kolumny: customerId i providerId, które prowadzą z powrotem do kolumny id dla Company.Querydsl dołącz do tej samej tabeli wiele razy

Korzystanie Querydsl jak mogę dołączyć na stole Company dwa razy więc mogę uzyskać name dla każdej spółki określonej przez customerId i providerId?

Kodeks wyjaśnia, że ​​może lepiej, co usiłuję:

Configuration configuration = new Configuration(templates); 
JPASQLQuery query = new JPASQLQuery(this.entityManager, configuration); 

QTask task = QTask.task; 
QCompany customer = QCompany.company; 
QCompany provider = QCompany.company; 

JPASQLQuery sql = query.from(task).join(customer).on(customer.id.eq(task.customerId)) 
    .join(provider).on(provider.id.eq(task.providerId)); 

return sql.list(task.id, customer.name.as("customerName"), provider.name.as("providerName")); 

który generuje SQL:

select task.id, company.name as customerName, company.name as providerName from task join company on company.id = task.customerId 

I naprawdę chciałbym go mieć:

select task.id, customer.name as customerName, provider.name as providerName from task join company as customer on customer.id = task.customerId join company as provider on provider.id = task.providerId 

Nie mogłem wymyślić, jak alias tabeli, do której się przyłączyłem, więc mogłem rozróżnić nazwy klientów i dostawców. Próbowałem wykonać new QCompany("company as provider"), ale to nie zadziałało. Czy ktoś wie, jak to zrobić?

Odpowiedz

13

Jeśli trzeba zmiennych prostu wykonaj następujące czynności

QCompany customer = new QCompany("customer"); 
QCompany provider = new QCompany("provider"); 

Zmiana przypisania domyślnej zmiennej QCompany.company nie pomaga

+0

Thanks Timo, ale tworzy kwerendy z tabeli „klient” i stołem "dostawca". Te tabele nie istnieją. To tylko jeden stół o nazwie firma. Gdyby zrobiło to "firma jako klient" i "firma jako dostawca", które działałyby świetnie. – Josh

+0

Jeśli QCompany jest klasą generowaną na podstawie APT, zapytanie nie będzie działać, w tym przypadku musisz użyć JPAQuery. JPASQLQuery jest dla zapytań SQL z typami Q wygenerowanymi przy użyciu tego podejścia http://www.querydsl.com/static/querydsl/3.6.1/reference/html/ch02s03.html#d0e668 –

+0

Bummer, to jest do bani. Czy jest to zamierzona rzecz, czy coś, na co mogę otworzyć bilet? – Josh

Powiązane problemy