如何使用 Jooq fetchStream 和类型安全映射

问题描述 投票:0回答:1

我对以下示例没有问题:

record ProductItem(Long productId, BigDecimal price) {
}

List<ProductItem> items = dsl().select(
        PRODUCT.PRODUCTID,
        PRODUCT.PRICE
)
.from(PRODUCT)
.fetch(Records.mapping(ProductItem::new));

但是当我尝试使用相同的示例与

fetchStream()
而不是
fetch()
时,
fetchStream()
不提供任何附加参数。

如果以下内容可行,那就太酷了:

List<ProductItem> items = dsl().select(
        PRODUCT.PRODUCTID,
        PRODUCT.PRICE
)
.from(PRODUCT)
.fetchSize(250)
.fetchStream(Records.mapping(ProductItem::new));

有没有其他方法可以通过 jooq 功能来实现我所需要的(类型安全流映射)?这会是jooq的新功能吗?

我发现以下内容有效。所以如果这可以安全使用,我想我可以用它来代替。

 .fetchStream()
 .map(Records.mapping(ProductItem::new));
jooq
1个回答
0
投票

之所以存在

ResultQuery.fetch(RecordMapper)
及相关方法,是因为
fetch()
是一个急切的获取操作,它将整个 JDBC
ResultSet
提取到内存中,放入某些客户端数据结构中。在这种情况下,一个
List<E>
。在该方法完成之前,底层 JDBC
ResultSet
PreparedStatement
将被关闭。因此需要某种方式将映射和其他转换函数传递给
fetch()
(或
ResultQuery.collect()
)方法。

fetchStream()
fetchLazy()
的情况并非如此,它们生成一个资源丰富的对象,在幕后保留开放的 JDBC 资源,并直接在流上提供映射方法。提供
fetchStream(RecordMapper)
和所有其他几十种重载根本没有任何好处,因为您可以直接在
Stream
API 上执行相同的操作。

足智多谋的方法

不要忘记将您的流包装在 try-with-resources 中!

try (Stream<Record> s = dsl().select(..).from(..).fetchStream()) {
    // Now map, collect, etc.
}
© www.soinside.com 2019 - 2024. All rights reserved.