JOOQでは、テーブルの行をjOOQ自動生成POJOにフェッチしたい場合は、たとえば次のようにします。
dsl.selectFrom(USER)
.where(USER.U_EMAIL.equal(email))
.fetchOptionalInto(User.class);
ここで、2つのテーブル間の結合を実行するとします。 USER
とROLE
、これら2つのテーブルのPOJOに結果をフェッチするにはどうすればよいですか?
これは 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>
_