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

