【问题标题】:JOOQ - Join table using string nameJOOQ - 使用字符串名称连接表
【发布时间】:2021-06-25 18:32:25
【问题描述】:

我有一个应用程序正在从 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)
);

【问题讨论】:

  • 嗨,我是 jooq 的新手,所以也许我误解了你链接的那个问题,但它是关于获取表模式,答案也说这样做,它没有解释如何我可以将字符串加入到普通查询中。
  • “自动生成的 jooq 表类无法识别”是什么意思
  • 为什么要切换到 JDBC?
  • jooq 从模式构建表,这就是查询中使用的。

标签: java jooq


【解决方案1】:

嵌套集合

您当前正在运行一个多对多连接查询,其中对于 1 个 BUSINESS,您有许多 BUSINESS_ADDRESS 条目。如果你想在这 1 个 BUSINESS 和许多 CONNECTION 条目之间加入另一个对多关系,你会在 BUSINESS_ADDRESSCONNECTION 之间得到一个 cartesian product,这可能不是你想要的。

您想要的输出数据结构看起来像这样:

class Business {
  // Business properties ...
  List<Address> addresses;
  List<Connection> connections;
}

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

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

使用表标识符

您可以使用plain SQL templatingidentifiers 将代码生成器中的表与代码生成器不可用的表混合在一起。

但是一旦您不再使用生成的代码,jOOQ 将不再提前知道您的投影将生成哪些列。您没有明确指定投影,因此 select() 将生成 SQL SELECT * 查询。假设您确实需要所有这些列,那么您当前遇到的问题是:

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

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

【讨论】:

  • 感谢您的回复,在这种情况下(至少在可预见的将来),我只会获得 1 个连接,有没有办法轻松地将其作为额外字段添加到业务字段中?
  • @Mankind1023:您可以使用视图来执行此操作,并使用为视图而不是表生成的代码。 jOOQ 的未来版本甚至可能支持合成视图:github.com/jOOQ/jOOQ/issues/11054
  • 我检查了你提供的那些链接,但我没有完全理解它们(我刚开始使用 jooq),你碰巧有一个很好的代码示例,我们得到一个包含多个列表的对象?理想情况下,无需手动迭代所有内容(例如 fetchInto),如果这有意义的话。
  • The blog post I've linked 没有帮助?那里混乱的根源是什么?您可以找到有关堆栈溢出的其他示例,例如stackoverflow.com/a/42680565/521799
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-27
  • 2018-08-16
  • 2012-02-23
  • 2014-03-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多