我正在尝试编写一个查询,其中使用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
select
t.week,
sum(iif(t.category = "A", 1, 0)) as A,
sum(iif(t.category = "B", 1, 0)) as B,
sum(iif(t.category = "C", 1, 0)) as C
from
YourTable t
group by
t.week
,但是使用起来并不容易,文档也没有解释。
如何懒惰地一次获取父子记录?
答案 0 :(得分:2)
在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())
)
);