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
相关产品推荐
相关产品推荐

