2016-07-06 27 views
6

In jOOQ wenn ich eine Zeile einer Tabelle in eine jOOQ POJOs holen wollen automatisch generierte ich tun, zum Beispiel:jOOQ kann ich holen einen Join von zwei Tabellen in die jeweiligen POJOs

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

Nun sei angenommen, dass Ich möchte eine Verbindung zwischen zwei Tabellen, z USER und ROLE, wie kann ich das Ergebnis in die POJOs für diese beiden Tabellen holen?

+0

Wie werden Benutzer und Rolle verbunden? Eins zu viele? Viele zu eins? Viel zu viel? –

+0

viele-zu-viele, also ja, es gibt eine Tabelle UserToRole auch –

Antwort

12

Dies ist eine Lösung mit 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) 
    ); 

Hinweis, wenn Sie LEFT JOIN stattdessen verwenden möchten (falls ein Benutzer notwendigerweise keine Rollen haben, und Sie wollen eine leere Liste pro Benutzer erhalten), Sie müssen NULL Rollen in leere Listen selbst übersetzen.

Stellen Sie sicher, Sie aktiviert haben equals() und hashCode() auf POJOs zu erzeugen, um der Lage sein, sie in ein HashMap als Schlüssel zu setzen:

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode> 
+0

Danke für die Antwort. Aber ich frage mich, wie das mit 'fetchLazy' kombiniert werden kann? –

+0

@Kango_V: Guter Punkt. Diese beiden Funktionen können derzeit nicht kombiniert werden. Ich habe dafür eine Feature-Anfrage erstellt: https://github.com/jOOQ/jOOQ/issues/6046. Sie können natürlich Ihren 'Cursor' (von' fetchLazy() ') in einen Java 8' Stream' transformieren und dann 'collect()' verwenden, um Ergebnisse zu gruppieren ... –

+0

Wie funktioniert das für eins zu viele? Beziehung? Wir haben eine Feature-Tabelle und eine Tier-Tabelle, 1 Tier kann mehrere Funktionen haben. Also wollte abfragen und als Map ausgegeben werden. > Byte entspricht einer TierID und Liste von Feature-Namen. – user160108