jOOQ могу ли я получить соединение двух таблиц в соответствующие POJOs

В jOOQ если я хочу получить строку таблицы в jOOQ autogenerated POJOs, я делаю, например:

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

Теперь предположим, что я хочу сделать соединение между двумя таблицами, например USER и ROLE, Как я могу получить результат в POJOs для этих двух таблиц?

1 ответов


это одно решение, используя 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)
   );

Примечание, Если вы хотите использовать LEFT JOIN вместо этого (в случае, если пользователь не обязательно имеет какие-либо роли, и вы хотите получить пустой список для каждого пользователя), вам придется перевести NULL роли, чтобы очистить списки самостоятельно.

убедитесь, что вы активировали генерирующая equals() и hashCode() на ваших POJOs, чтобы иметь возможность поместить их в HashMap ключи:

<pojosEqualsAndHashCode>true</pojosEqualsAndHashCode>