You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用jOOQ的multiset按作者ID分组获取Book POJO的最优写法

关于jOOQ中multiset操作符映射多对多关系的优化写法疑问

以图书(book)、作者(author)及关联表(book_author)的多对多关系为例,我希望使用multiset操作符按作者ID分组获取对应的图书列表。根据参考示例,我预期的代码写法如下:

select(
        AUTHOR.ID,
        multiset(
            select(BOOK_AUTHOR.book())
            .from(BOOK_AUTHOR)                                        
            .where(BOOK_AUTHOR.AUTHOR_ID.eq(AUTHOR.ID)))
            .as("books").convertFrom(r -> r.map(mapping(Book::new)))
        .from(AUTHOR)
        .fetchMap(...)

但实际映射时,转换器接收的是Record1<BookRecord>类型,而期望的是BookRecord类型,因此我不得不嵌套映射:

dsl.select(
        AUTHOR.ID,
        multiset(
            select(BOOK_AUTHOR.book())
            .from(BOOK_AUTHOR)
            .where(BOOK_AUTHOR.AUTHOR_ID.eq(AUTHOR.ID)))
            .as("books")
            //👇 看起来不太合理
            .convertFrom(r -> r.map(mapping((b) -> mapping(Book::new).apply(b)))))
        .from(AUTHOR)
        .fetchMap(AUTHOR.ID, mapping((a, b) -> b));

请问这是实现该multiset查询最直接明了的写法吗?


编辑补充:

在得到之前问题的解答后,我写出了优化版本,但仍与示例不符:

dsl.select(
    AUTHOR.ID,
    multiset(
            select(BOOK_AUTHOR.book().mapping(Book::new)) //👈
            .from(BOOK_AUTHOR)
            .where(BOOK_AUTHOR.AUTHOR_ID.eq(AUTHOR.ID)))
            .as("books").convertFrom(r -> r.map(Record1::value1)))
    .from(AUTHOR)
    .fetchMap(AUTHOR.ID, Record2::value2);

注:我清楚此处并非必须使用multiset,这是我探索分组POJO获取方式的衍生场景。


内容的提问来源于stack exchange,提问作者kaqqao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 15:29:59