繁体   English   中英

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

[英]How to lazily fetch groups in JOOQ?

我正在尝试编写一个查询,在该查询中我使用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但它不是简单的如何使用它和文档不任何解释。

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

在 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())
        )
    );
}

Collectors.groupingBy()的 Javadoc 有一个类似的例子。

使用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())
        )
    );

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM