2016-07-06 10 views
6

に二つのテーブルを結合フェッチすることができます私は2つのテーブル間の結合をしたい、例えばUSERROLEの場合、これらの2つのテーブルのPOJOに結果をフェッチするにはどうすればよいですか? 、jOOQは、私は、たとえば、自動生成さjOOQに私はPOJOをテーブルの行を取得したい場合はjOOQでそれぞれのPOJO

+0

どのようにユーザーとロールに接続されていますか? 1対多数?多対一?多対多? –

+0

多対多なので、テーブルがあります。UserToRole –

答えて

12

はこれがあなたの代わりにLEFT JOINを使用したい場合は、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) 
    ); 

注意を使用して一つの解決策である(ユーザーは、必ずしもすべての役割を持っていない場合には、あなたは、ユーザーごとに空のリストを取得したいです) NULLロールを空のリストに自分で変換する必要があります。

あなたがキーとしてHashMapでそれらを置くことができるようにするために、あなたのPOJOにequals()hashCode()を生成するアクティブ化していることを確認してください:

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode> 
+0

ありがとうございます。しかし、これは 'fetchLazy'とどのように組み合わせることができるのだろうか? –

+0

@Kango_V:良い点。これらの2つの機能は現在組み合わせることはできません。私はこのための機能要求を作成しました:https://github.com/jOOQ/jOOQ/issues/6046。もちろん、あなたの 'Cursor'(' fetchLazy() 'から)をJava 8の' Stream'に変換し、 'collect()'を使って結果をグループ化することができます。 –

+0

1対多関係? FeatureテーブルとTierテーブルがあり、1つのティアには複数の機能があります。そのため、Map >バイトがtierIDおよび機能名のリストに対応するため、クエリを実行して出力を取得する必要がありました。 – user160108

関連する問題