gpt4 book ai didi

java - 如何在JOOQ中延迟获取组?

转载 作者:行者123 更新时间:2023-12-02 11:03:36 24 4
gpt4 key购买 nike

我正在尝试编写一个查询,在其中使用 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())
)
);

关于java - 如何在JOOQ中延迟获取组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56736380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com