我对以下示例没有问题:
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));
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.
}