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

JOOQ使用multiset查询多对多关联返回重复书籍数据问题求解

问题根因

你当前的查询主表选择了book_author中间关联表,这个表本身有3条符合过滤条件的记录(book_id=1对应1条、book_id=2对应2条),SQL原生返回3行结果,fetchInto(Book.class)是逐行做对象映射,自然就生成了3个Book对象,每个Book的authors列表仅对应关联表当前行的单个作者,和预期不符。

修正后的查询写法

正确的做法是将主表替换为BOOK,在multiset内部通过book_author中间表关联查询当前书籍对应的所有作者:

List<Book> books = dsl.select(
        BOOK.BOOK_ID.as("id"),
        BOOK.TITLE,
        BOOK.ISBN,
        multiset(
                select(AUTHOR.AUTHOR_ID.as("id"), AUTHOR.AUTHOR_NAME.as("name"))
                .from(AUTHOR)
                .join(BOOK_AUTHOR).on(AUTHOR.AUTHOR_ID.eq(BOOK_AUTHOR.AUTHOR_ID))
                .where(BOOK_AUTHOR.BOOK_ID.eq(BOOK.BOOK_ID))
        ).as("authors").convertFrom(record -> record.map(Records.mapping(Author::new)))
).from(BOOK)
 .where(BOOK.BOOK_ID.in(1, 2))
 .fetchInto(Book.class);

修正后SQL返回的行数和BOOK表的匹配行数一致(仅2行),每一行的authors字段会预聚合好当前书籍的所有作者列表,映射后就能得到符合预期的2个Book对象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:24:01