如何使用 JOOQ 在运行时重写 table 限定符
How to rewrite the table qualifier at runtime with JOOQ
当使用 JOOQ 为 SQL 服务器数据库生成代码时,生成会创建由三部分组成的限定符,例如:[catalog].[schema].[table]
。这正是我在使用 SQL 服务器数据库时想要的,但是在将生成的代码与另一个数据库(如内存中的 H2 数据库)一起用于单元测试时会出现问题。
H2 方言不支持这些由三部分组成的限定符,H2 需要类似 [catalog].[table] 的东西。这会在针对 H2 执行如下命令时导致语法错误:
context.createTable(TBLBUSINESSENTITY).columns(TBLBUSINESSENTITY.fields()).execute();
为了解决这个问题,我需要在运行时更改限定符,我认为这可以使用渲染映射和映射模式来完成。不幸的是,这似乎只能像这样修改限定符的模式部分:
Settings settings = new Settings().withRenderMapping(new RenderMapping().withSchemata(
new MappedSchema().withInput("dbo").withOutput("mySchema")));
给定限定符 [MyDatabase].[dbo].[MyTable]
,这映射到 [MyDatabase].[mySchema].[MyTable]
,但我不知道如何完全删除该部分。
有什么方法可以将映射重写为 [MyDatabase].[MyTable]
?
改为使用此设置:
Settings settings = new Settings()
.withRenderCatalog(false)
.withRenderMapping(new RenderMapping()
.withCatalogs(new MappedCatalog()
.withInput("MyDatabase")
.withSchemata(new MappedSchema()
.withInput("dbo")
.withOutput("MyDatabase"))));
当使用 JOOQ 为 SQL 服务器数据库生成代码时,生成会创建由三部分组成的限定符,例如:[catalog].[schema].[table]
。这正是我在使用 SQL 服务器数据库时想要的,但是在将生成的代码与另一个数据库(如内存中的 H2 数据库)一起用于单元测试时会出现问题。
H2 方言不支持这些由三部分组成的限定符,H2 需要类似 [catalog].[table] 的东西。这会在针对 H2 执行如下命令时导致语法错误:
context.createTable(TBLBUSINESSENTITY).columns(TBLBUSINESSENTITY.fields()).execute();
为了解决这个问题,我需要在运行时更改限定符,我认为这可以使用渲染映射和映射模式来完成。不幸的是,这似乎只能像这样修改限定符的模式部分:
Settings settings = new Settings().withRenderMapping(new RenderMapping().withSchemata(
new MappedSchema().withInput("dbo").withOutput("mySchema")));
给定限定符 [MyDatabase].[dbo].[MyTable]
,这映射到 [MyDatabase].[mySchema].[MyTable]
,但我不知道如何完全删除该部分。
有什么方法可以将映射重写为 [MyDatabase].[MyTable]
?
改为使用此设置:
Settings settings = new Settings()
.withRenderCatalog(false)
.withRenderMapping(new RenderMapping()
.withCatalogs(new MappedCatalog()
.withInput("MyDatabase")
.withSchemata(new MappedSchema()
.withInput("dbo")
.withOutput("MyDatabase"))));