使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询

Posted

技术标签:

【中文标题】使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询【英文标题】:Build Left Join Query with JOOQ using two Tables from two Different Databases 【发布时间】:2017-10-17 05:17:49 【问题描述】:

我们正在使用 JOOQ 执行所有查询。

现在我们需要用 JOOQ 创建左连接查询,什么将左连接来自两个不同数据库的两个表

示例原生 SQL 查询(如下),我们需要使用 JOOQ 框架构建此查询,而不是使用原生 sql。到目前为止我还没有找到任何解决方案,也许 JOOQ 不支持此功能

SELECT * 
FROM `library`.`books` 
LEFT JOIN `library2`.`author2` ON `library`.`books`.`author_id` = `library2`.`author2`.`id`

【问题讨论】:

【参考方案1】:

代码生成器配置

如果您想使用两个不同的数据库/架构,则需要相应地配置代码生成器。您可以指定多个输入模式as documented here:

<configuration>
  <generator>
    <database>
      <schemata>
        <schema>
          <inputSchema>library</inputSchema>
        </schema>
        <schema>
          <inputSchema>library2</inputSchema>
        </schema>
      </schemata>
    </database>
  </generator>
</configuration>

替代方案:

您可以放弃 &lt;inputSchema/&gt; 配置,jOOQ 的代码生成器将简单地生成所有可用的模式。 您可以配置多个独立的代码生成,每个架构一个。这意味着您的架构没有相互共享的链接元数据(例如外键)。

查询

jOOQ manual recommends referencing tables from a global generated Tables class。这适用于单模式设置。当查询多个模式时,可能值得从生成的模式实例中引用表。以下是编写查询的方法:

import static com.example.generated.library .Library .LIBRARY ;
import static com.example.generated.library2.Library2.LIBRARY2;
//                                  ^^^^^^^^ ^^^^^^^^ ^^^^^^^^
//                                     |        |        |
// Package per schema -----------------+        |        |
// Schema class       --------------------------+        |
// Schema instance    -----------------------------------+

然后:

DSL.using(configuration)
   .select()
   .from(LIBRARY.BOOKS)
   .leftJoin(LIBRARY2.AUTHOR2)
   .on(LIBRARY.BOOKS.AUTHOR_ID.eq(LIBRARY2.AUTHOR2.ID))
   .fetch();

【讨论】:

感谢 Lukas,您的解决方案有效,它解决了我的问题

以上是关于使用来自两个不同数据库的两个表使用 JOOQ 构建左连接查询的主要内容,如果未能解决你的问题,请参考以下文章

如何配置 pom.xml 以将 jooq 类生成到两个不同的包中?

在 AngularFirestore 中使用来自两个不同集合的数据构建对象时遇到问题

如何使用来自两个不同表SQLite的元素更新/删除

我们可以对两个不同的数据库表使用连接吗?

jOOQ 我可以将两个表的连接提取到各自的 POJO 中吗

将来自两个选择查询的数据添加到一个表中,这些查询针对来自两个不同表的不同列数