【问题标题】:How to lazily fetch groups in JOOQ?如何在 JOOQ 中懒惰地获取组?
【发布时间】:2019-06-24 12:16:08
【问题描述】:

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

我尝试使用Collectors.groupingBy 来collect,但如何使用它并不简单,文档也没有解释它。

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

【问题讨论】:

  • 我通过结合 rxjava/2 和 jooq 解决了这个问题。还记得在你的 jdbc 驱动程序中设置 fetchsize
  • 我没有使用 rxjava,也不想使用。

标签: java stream jooq


【解决方案1】:

在 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())
        )
    );

【讨论】:

    猜你喜欢
    • 2016-11-06
    • 1970-01-01
    • 2015-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-06-07
    • 1970-01-01
    相关资源
    最近更新 更多