2016-07-06 7 views
6

In jOOQ se voglio recuperare una riga di una tabella in un jOOQ generata automaticamente POJO che faccio, per esempio:jOOQ posso prendere un join di due tabelle nei rispettivi POJO

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

Ora, supponiamo che Voglio fare un join tra due tabelle, ad es USER e ROLE, come posso recuperare il risultato nei POJO per queste due tabelle?

+0

Come vengono utente e ruolo collegato? Uno-a-molti? Molti-a-uno? Molti-a-molti? –

+0

molti-a-molti, quindi sì, c'è un tavolo UserToRole anche –

risposta

12

Questa è una soluzione che utilizza 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) 
    ); 

nota, se si desidera utilizzare LEFT JOIN invece (nel caso in cui un utente non deve necessariamente tutti i ruoli, e si desidera ottenere una lista vuota per utente), dovrai tradurre i ruoli NULL in una lista vuota.

Assicurarsi di aver attivato la generazione equals() e hashCode() sul tuo POJO in modo da essere in grado di metterli in un HashMap come chiavi:

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode> 
+0

Grazie per la risposta. Ma mi chiedevo solo come questo possa essere combinato con 'fetchLazy'? –

+0

@ Kango_V: buon punto. Al momento queste due funzioni non possono essere combinate. Ho creato una richiesta di funzionalità per questo: https://github.com/jOOQ/jOOQ/issues/6046. Ovviamente puoi trasformare il tuo 'Cursor' (da' fetchLazy() ') in un Java' Stream' e poi usare 'collect()' per raggruppare i risultati ... –

+0

come funziona per uno a molti relazione? Abbiamo una tabella delle caratteristiche e una tabella dei livelli, 1 livello può avere più funzioni. Pertanto, desiderava eseguire una query e ottenere l'output in quanto il byte Map > corrisponde a un tierID e all'elenco di nomi di funzionalità. – user160108