以多对多(book_author)关系中的bookauthor个表为例.

我目前有这个,而且很管用:

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);

推荐答案

你可能能做到这一点?

.fetchGroups(
    BOOK_AUTHOR.AUTHOR_ID,
    r -> r.value2().into(Book.class)
);

或者这样:

.fetchGroups(
    r -> r.value1(),
    r -> r.value2().into(Book.class)
);

这使用反射(在DefaultRecordMapper中)将嵌套的BOOK_AUTHOR.book()记录的book列映射到Book POJO.如果在代码生成器中启用了<recordsImplementingRecordN/>标志,则可以在查询中执行以下操作:

BOOK_AUTHOR.book().mapping(Book::new)

也许还有其他方法可以"改善"事情,尽管正如我在 comments 中所说,这似乎是主观的.或者,您可能正在寻找一个可以添加到jOOQ API?You could request it here中的specific操作符.

Java相关问答推荐

是否需要关闭Executors返回的执行器.newVirtualThreadPerTaskExecutor()?

Cucumber TestNG Assert失败,出现java. lang. Numbercycle异常

如何在返回bigint []值的子查询中使用any?

如何打印本系列的第n项y=-(1)-(1+2)+(1+2+3)+(1+2+3+4)-(1+2+3+4+5)...Java中的(1+2+3+4...+n)

SpringBootreact 式Web应用程序的Spring Cloud Configer服务器中的资源控制器损坏

为什么JAVA&S清洁器使用链表而不是并发HashSet?

内存中的H2修剪尾随空格

Mac上的全屏截图在使用JavaFX时不能正常工作吗?

自定义批注的外推属性值

生成桥方法以解决具有相同擦除的冲突方法

如何在Microronaut中将 map 读取为 map

没有使用Lombok生成的参数

EXCEL中的公式单元格显示#NAME?

如何使用Criteria Builder处理一对多关系中的空值?

每次我需要时创建和关闭数据库连接会有什么效果吗?

在Eclipse中可以使用外部字体吗?

如何对存储为字符串的大数字数组进行排序?

JXBrowser是否支持加载Chrome扩展?

为什么JavaFX MediaPlayer音频播放在Windows和Mac上运行良好,但在Linux(POPOS/Ubuntu)上却有问题?

窗口启动后不久,从java.awt.Graphics disapear创建的矩形