[英]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.