如何在 JOOQ 中懒惰地获取组?

Ada*_*old 5 java stream jooq

我正在尝试编写一个查询,在该查询中我使用leftJoin如下方式为我的聚合根获取子记录:

dslContext.select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .stream()
Run Code Online (Sandbox Code Playgroud)

我的问题是我需要使用,stream因为有非常多的记录,但是这样我无法使用fetchGroups我通常在需要父子记录时使用的方法。

这就是我的使用方式fetchGroups:

dslContext.select()
    .from(PARENT)
    .leftJoin(CHILD)
    .on(CHILD.PARENT_ID.eq(PARENT.ID))
    .fetchGroups(Parent.class, Child.class)
Run Code Online (Sandbox Code Playgroud)

这Map<Parent, Child>对我来说会很好。

我尝试collect使用,Collectors.groupingBy但如何使用它并不简单,文档也没有解释它。

如何懒惰地一次性获取父子记录?

Luk*_*der 5

在 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())
        )
    );
}
Run Code Online (Sandbox Code Playgroud)

的 JavadocCollectors.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())
        )
    );
Run Code Online (Sandbox Code Playgroud)