程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符?

开发过程中遇到JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符的问题如何解决?下面主要结合日常开发的经验,给出你关于JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符的解决方法建议,希望对你解决JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符有所启发或帮助;

我有一个应用程序正在从 jooq 切换到 jdbc,我使用 jdbc 创建了一个表,但我需要编辑一些 jooq 查询以将其加入,问题是自动生成的 jooq 表类无法识别它,那么有没有办法通过字符串名称引用表?

这是一些示例代码:

private final Business BUSInesS = tables.BUSInesS; // table that jooq auto generated in jar file
....

Map<BusinessRecord,List<BusinessAddressRecord>> resultMap = dslContext
.select()
.from(BUSInesS.leftOuterJoin(BUSInesS_ADDRESS).on(BUSInesS.ID.eq(BUSInesS_ADDRESS.BUSInesS_ID)))
.where(BUSInesS.ID.equal(ID))
.and(BUSInesS_ADDRESS.DEACTIVATED_AT.isNull())
.fetchGroups(
    a -> a.into(BUSInesS),b -> b.into(BUSInesS_ADDRESS)
);

我将如何在此处加入“连接”表?没有 tables.CONNECTION,因为它是以不同的方式创建的。

有很多查询,所以我们希望根据需要逐步进行切换。

更新: 我尝试添加以下内容,并且查询运行,但我试图获取的字段始终为空,我猜是因为 BusinessRecord 表没有与 DTO 相同的字段,那么如何解决?

Map<BusinessRecord,List<BusinessAddressRecord>> resultMap = dslContext
.select()
.from(BUSInesS)
.leftOuterJoin(BUSInesS_ADDRESS)
.on(BUSInesS.ID.eq(BUSInesS_ADDRESS.BUSInesS_ID))
.join("connection")
.on("CAST(connection.business_ID as bigint) = business.ID")
.where(BUSInesS.ID.equal(ID))
.and(BUSInesS_ADDRESS.DEACTIVATED_AT.isNull())
.fetchGroups(
    a -> a.into(BUSInesS),b -> b.into(BUSInesS_ADDRESS)
);

解决方法

嵌套集合

您当前正在运行对多联接查询,其中 1 const response = await fetch(process.env.REACT_APP_API_HOSTNAME + '/api/reservations/' + property.slug,{ method: 'POST',headers: { 'Content-Type': 'application/json',},body: JSON.stringify(requestBody) }); 有多个 BUSINESS 条目。如果您想在 1 个 BUSINESS_ADDRESS 和多个 BUSINESS 条目之间加入另一个多对多关系,您将在 CONNECTIONBUSINESS_ADDRESS 之间得到一个 cartesian product,这可能不是您想要的。

看起来你想要的输出数据结构是这样的:

CONNECTION

使用 jOOQ,这种集合的嵌套最好直接使用 SQL 通过数组或通过 SQL/JSON 或 SQL/XML 完成。 See this blog post for details。

请注意,直接用 JDBC 实现这种事情会变得更加困难。

使用表标识符

您可以使用 plain SQL templating 或使用 identifiers 将代码生成器中的表与代码生成器不可用的表混合使用。

但是一旦您不再使用生成的代码,jOOQ 将不再提前知道您的投影将生成哪些列。您没有明确指定投影,因此 class Business { // Business properties ... List<Address> addresses; List<Connection> connections; } 将生成 SQL select() 查询。假设您确实需要所有这些列,您目前遇到的问题是:

  • 您并未真正映射 SELECT * 表中的任何内容。您正在投影其列,但您的 connection 表达式继续仅引用其他两个表中的列
  • 当您将生成的代码与纯 SQL 模板混合使用时,各个表的列之间可能存在歧义,并且 jOOQ 无法再正确解析映射。这也可能导致错误的结果。

所以,简而言之:要知道您的任务不仅仅是添加联接。您可能还需要更新您的投影(fetchGroups() 子句)和您的映射 (SELECT) 表达式。但我确实建议您查看此查询的目标是什么,并可能恢复到嵌套集合方法。

大佬总结

以上是大佬教程为你收集整理的JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符全部内容,希望文章能够帮你解决JOOQ - 使用字符串名称连接表 嵌套集合使用表标识符所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: