以多对多(Book_Author)关系中的book和Author表的常见示例为例.如果我想获取每个作者ID的图书列表,特别是使用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));
这是表达这个多集查询的最直接/最明显的方式吗?
编辑:
以下是我在得到earlier question个答案后的改进版本(尽管仍不是示例中promise 的):
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);
*我知道我在这里并不真的需要多集.这是我关于POJO分组的previous question个副产品,我只是在探索各种 Select .