Как лениво извлекать группы в JOOQ? - PullRequest
2 голосов
/ 24 июня 2019

Я пытаюсь написать запрос, в котором я получаю дочерние записи для моего сводного корня, используя leftJoin, например:

dslContext.select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .stream()

Моя проблема в том, что мне нужно использовать stream, потому что тамочень большое количество записей, но таким образом я не могу использовать fetchGroups, который я обычно использовал бы, когда мне нужны записи родитель-потомок.

Вот как я бы использовал fetchGroups:

dslContext.select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .fetchGroups(Parent.class, Child.class)

, что создаст для меня хороший Map<Parent, Child>.

Я пытался collect использовать Collectors.groupingBy, но не совсем понятно, как его использовать, и документы не объясняютэто либо.

Как я могу получить лениво-родительские записи за один раз?

1 Ответ

2 голосов
/ 25 июня 2019

В jOOQ 3.11 мы добавили новый метод ResultQuery.collect(), и мы планируем повторно реализовать большую часть нашей fetchXYZ() логики в качестве стандартной Collector реализаций, который затем можно использовать с Stream для достижения именно того, что вы ищете.Основным драйвером для этого является предотвращение распространения большего числа этих fetchXYZ() перегрузок и обеспечение большей возможности компоновки.

Конечно, вы можете сделать это вручную:

Используя Stream, если вы хотите добавить дополнительные операции в конвейер потока

// Don't forget, this is a resourceful stream!
try (Stream<Record> stream = dslContext.select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .stream()) {

    Map<Parent, List<Child>> result = stream.collect(
        Collectors.groupingBy(r -> r.into(Parent.class),
            Collectors.mapping(r -> r.into(Child.class), Collectors.toList())
        )
    );
}

Javadoc Collectors.groupingBy() имеет аналогичный пример.

Использование ResultQuery.collect(), если вам не нужен потоковый конвейер.

В качестве альтернативы, использование jOOQ 3.11 ResultQuery.collect()

Map<Parent, List<Child>> result = dslContext
    .select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .collect(
        Collectors.groupingBy(r -> r.into(Parent.class),
            Collectors.mapping(r -> r.into(Child.class), Collectors.toList())
        )
    );
...