2016-07-06 13 views
6

W jOOQ jeśli chcę pobrać wiersz tabeli w jOOQ wygenerowany automatycznie POJOs ja, na przykład:jOOQ mogę pobrać złączenia dwóch tabel w odpowiednich POJOs

dsl.selectFrom(USER) 
       .where(USER.U_EMAIL.equal(email)) 
       .fetchOptionalInto(User.class); 

Teraz załóżmy, że Chcę zrobić sprzężenie między dwiema tabelami, np USER i ROLE, w jaki sposób mogę pobrać wynik do POJO dla tych dwóch tabel?

+0

Jak użytkownik i rola podłączone? Jeden za dużo? Wiele do jednego? Wiele do wielu? –

+0

wiele-do-wielu, więc tak, istnieje tabela UserToRole również –

Odpowiedz

12

To jedno rozwiązanie wykorzystujące ResultQuery.fetchGroups(RecordMapper, RecordMapper)

Map<UserPojo, List<RolePojo>> result = 
dsl.select(USER.fields()) 
    .select(ROLE.fields()) 
    .from(USER) 
    .join(USER_TO_ROLE).on(USER.USER_ID.eq(USER_TO_ROLE.USER_ID)) 
    .join(ROLE).on(ROLE.ROLE_ID.eq(USER_TO_ROLE.ROLE_ID)) 
    .where(USER.U_EMAIL.equal(email)) 
    .fetchGroups(

     // Map records first into the USER table and then into the key POJO type 
     r -> r.into(USER).into(UserPojo.class), 

     // Map records first into the ROLE table and then into the value POJO type 
     r -> r.into(ROLE).into(RolePojo.class) 
    ); 

Uwaga, jeśli chcesz używać LEFT JOIN zamiast (w przypadku, gdy użytkownik nie musi mieć żadnych ról, a chcesz uzyskać pustą listę na użytkownika), musisz sam przetłumaczyć role z pustych list na NULL.

Upewnij się, że aktywna generując equals() i hashCode() na swoim POJOs aby móc umieścić je w HashMap jak klucze:

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode> 
+0

Dzięki za odpowiedź. Ale zastanawiałeś się, jak można to połączyć z 'fetchLazy'? –

+0

@Kango_V: Dobra uwaga. Te dwie funkcje obecnie nie mogą być łączone. Stworzyłem żądanie funkcji: https://github.com/jOOQ/jOOQ/issues/6046. Możesz, oczywiście, przekształcić 'Cursor' (z' fetchLazy() ') do strumienia' 8' Java ', a następnie użyć' collect() 'do grupowania wyników ... –

+0

jak to działa dla jednego do wielu statek relacji? Mamy tabelę funkcji i tabelę poziomów, 1 warstwa może mieć wiele funkcji. Chcieliśmy zapytać i otrzymać dane wyjściowe, ponieważ bajt > odpowiada identyfikatorowi Tier ID i listom nazw funkcji. – user160108

Powiązane problemy