使用JOOQ按外部字段分组获取POJO,嵌套mapping是否最优?
优化jOOQ多对多关联分组的映射写法
针对你用jOOQ处理book-author多对多关系时的分组查询代码,确实有更简洁直观的写法,避免嵌套mapping的冗余:
方案1:简化映射逻辑,用Record.into()替代嵌套mapping
原代码中嵌套的mapping可以直接替换为record.value2().into(Book.class),利用jOOQ Record自带的POJO转换方法,代码更简洁:
Map<UUID, List<Book>> booksByAuthorId = dsl .select(BOOK_AUTHOR.AUTHOR_ID, BOOK_AUTHOR.book()) .from(BOOK_AUTHOR) .where(BOOK_AUTHOR.AUTHOR_ID.in(authorIds)) .fetchGroups( BOOK_AUTHOR.AUTHOR_ID, record -> record.value2().into(Book.class) );
这里record.value2()获取到BOOK_AUTHOR.book()返回的BookRecord,再通过into(Book.class)直接转换为Book对象,省去了嵌套的mapping调用。
方案2:显式关联BOOK表,直接映射POJO
如果希望逻辑更清晰,可以显式join BOOK表,直接查询BOOK的字段,这样映射时无需额外处理关联记录,写法更直观:
Map<UUID, List<Book>> booksByAuthorId = dsl .select(BOOK_AUTHOR.AUTHOR_ID, BOOK.fields()) .from(BOOK_AUTHOR) .join(BOOK).on(BOOK_AUTHOR.BOOK_ID.eq(BOOK.ID)) .where(BOOK_AUTHOR.AUTHOR_ID.in(authorIds)) .fetchGroups( BOOK_AUTHOR.AUTHOR_ID, mapping(Book::new) );
这种写法明确展示了表关联逻辑,查询的字段直接对应Book的属性,mapping(Book::new)可以直接将查询结果映射为Book对象,完全避免了嵌套逻辑,可读性更强。
原代码的冗余点说明
原代码中嵌套的mapping((a, bookRecord) -> mapping(Book::new).apply(bookRecord))存在两个冗余:
- 第一个
mapping的参数a(AUTHOR_ID)并未被使用,只是为了传递bookRecord参数 - 嵌套的
mapping(Book::new).apply(bookRecord)可以用更直接的POJO转换方法替代
内容的提问来源于stack exchange,提问作者kaqqao
相关产品推荐
相关产品推荐

