Вы должны вручную сгруппировать эти <B, C>
типы в некоторую структуру данных, например, jOOλ's Tuple2
тип или также AbstractMap.SimpleEntry
Map<APojo, List<Tuple<BPojo, CPojo>>> result =
using(configuration()).select(A.fields())
.select(B.fields())
.select(C.fields())
.from(A)
.leftJoin(B).on(B.aId.eq(A.aId))
.leftJoin(C).on(C.cId.eq(B.cId))
.fetchGroups(
r -> r.into(A).into(APojo.class),
r -> tuple(
r.into(B).into(BPojo.class),
r.into(C).into(CPojo.class)));
Альтернативой может быть использование потоков и вложенных карт:
Map<APojo, Map<BPojo, CPojo>> result =
using(configuration()).select(A.fields())
.select(B.fields())
.select(C.fields())
.from(A)
.leftJoin(B).on(B.aId.eq(A.aId))
.leftJoin(C).on(C.cId.eq(B.cId))
.fetch()
.stream()
.collect(Collectors.groupingBy(
r -> r.into(A).into(APojo.class),
Collectors.toMap(
r -> r.into(B).into(BPojo.class),
r -> r.into(C).into(CPojo.class))));
jOOQ 3.11 будет включать ResultQuery.collect()
метод , поэтому вызов fetchStream()
можно опустить:
Map<APojo, Map<BPojo, CPojo>> result =
using(configuration()).select(A.fields())
.select(B.fields())
.select(C.fields())
.from(A)
.leftJoin(B).on(B.aId.eq(A.aId))
.leftJoin(C).on(C.cId.eq(B.cId))
.collect(Collectors.groupingBy(
r -> r.into(A).into(APojo.class),
Collectors.toMap(
r -> r.into(B).into(BPojo.class),
r -> r.into(C).into(CPojo.class))));