如何在JOOQ中延迟获取组?

时间:2019-06-24 12:16:08

标签: java stream 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 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 ,但是使用起来并不容易,文档也没有解释。

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

1 个答案:

答案 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())
        )
    );