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ć?
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
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 –
Bummer, to jest do bani. Czy jest to zamierzona rzecz, czy coś, na co mogę otworzyć bilet? – Josh