使用来自两个不同数据库的两个表使用 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>
替代方案:
您可以放弃<inputSchema/>
配置,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 类生成到两个不同的包中?