web-dev-qa-db-ja.com

jOOQは2つのテーブルの結合をそれぞれのPOJOにフェッチできますか

JOOQでは、テーブルの行をjOOQ自動生成POJOにフェッチしたい場合は、たとえば次のようにします。

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

ここで、2つのテーブル間の結合を実行するとします。 USERROLE、これら2つのテーブルのPOJOに結果をフェッチするにはどうすればよいですか?

15
mat_boy

これは ResultQuery.fetchGroups(RecordMapper, RecordMapper) を使用する1つのソリューションです

_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)
   );
_

代わりに_LEFT JOIN_を使用する場合(ユーザーに必ずしも役割がない場合、ユーザーごとに空のリストを取得する場合)、NULLの役割を翻訳する必要があります。自分でリストを空にします。

POJOをキーとしてHashMapに配置できるようにするために、POJOでequals()およびhashCode()の生成をアクティブにしたことを確認してください。

_<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode>
_
25
Lukas Eder