我正在尝试编写一个查询,在该查询中我使用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但如何使用它并不简单,文档也没有解释它。
如何懒惰地一次性获取父子记录?
在 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)
| 归档时间: |
|
| 查看次数: |
1573 次 |
| 最近记录: |