以多对多(book_author
)关系中的book
和author
个表为例.
我目前有这个,而且很管用:
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,
mapping((a, bookRecord) -> mapping(Book::new).apply(bookRecord)));
但嵌套的mapping
让我觉得我做错了什么.这真的是最明显的方法吗?
如果我用multiset
重写它,基于this example ,我希望它看起来是这样的:
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")
//? seems wrong
.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);