Jooq 在生成的查询中动态更改数据库的架构
Jooq dynamically change db's schema in generated query
我在简单数据库中有 2 个相似的模式 - "develop" 和 "stage"。我已经使用 Jooq 为其中一个模式生成了 Java 类(例如 "develop")。当 jooq 生成对数据库的查询时,它隐式地将模式名称添加到所有查询的别名中
select "develop"."image"."id", "develop"."image"."image_data"
from "develop"."image"
where "develop"."image"."id" = ?
所以我的问题是,是否有办法在生成的查询中更改 jooq 架构名称(例如 "stage")而不为 "stage" 架构重新生成 jooq 的 类?
您有多种选择,甚至可以组合使用:
使用代码生成器的架构映射功能
如果您想避免将 "develop"
架构名称硬连接到生成的 类 中,您可以将其重写为其他架构名称,如下所示:
<configuration>
<generator>
<database>
<schemata>
<schema>
<inputSchema>develop</inputSchema>
<outputSchema>stage</outputSchema>
</schema>
...
当然,这只是推迟了问题的发生,因为架构名称仍然在生成的代码中。您可以使用以下选项从生成的代码中完全删除名称:
<configuration>
<generator>
<database>
<schemata>
<schema>
<inputSchema>develop</inputSchema>
<outputSchemaToDefault>true</outputSchemaToDefault>
</schema>
...
现在这将从生成的代码中删除所有架构引用,因此生成的 类 可以 运行 您的所有架构(请务必使用正确的连接和 search_path,当然!)
我认为这是最适合你的选择
使用运行时间模式映射功能
您可以保持生成的代码不变,并在 运行 时使用 Settings
(which you supply to your jOOQ runtime Configuration
重写所有对象引用。同样,您有两个相同的选项:
映射架构名称:
new Settings().withRenderMapping(new RenderMapping()
.withSchemata(new MappedSchema()
.withInput("develop")
.withOutput("stage")
)
);
正在删除所有架构名称:
new Settings().withRenderSchema(false);
我在简单数据库中有 2 个相似的模式 - "develop" 和 "stage"。我已经使用 Jooq 为其中一个模式生成了 Java 类(例如 "develop")。当 jooq 生成对数据库的查询时,它隐式地将模式名称添加到所有查询的别名中
select "develop"."image"."id", "develop"."image"."image_data"
from "develop"."image"
where "develop"."image"."id" = ?
所以我的问题是,是否有办法在生成的查询中更改 jooq 架构名称(例如 "stage")而不为 "stage" 架构重新生成 jooq 的 类?
您有多种选择,甚至可以组合使用:
使用代码生成器的架构映射功能
如果您想避免将 "develop"
架构名称硬连接到生成的 类 中,您可以将其重写为其他架构名称,如下所示:
<configuration>
<generator>
<database>
<schemata>
<schema>
<inputSchema>develop</inputSchema>
<outputSchema>stage</outputSchema>
</schema>
...
当然,这只是推迟了问题的发生,因为架构名称仍然在生成的代码中。您可以使用以下选项从生成的代码中完全删除名称:
<configuration>
<generator>
<database>
<schemata>
<schema>
<inputSchema>develop</inputSchema>
<outputSchemaToDefault>true</outputSchemaToDefault>
</schema>
...
现在这将从生成的代码中删除所有架构引用,因此生成的 类 可以 运行 您的所有架构(请务必使用正确的连接和 search_path,当然!)
我认为这是最适合你的选择
使用运行时间模式映射功能
您可以保持生成的代码不变,并在 运行 时使用 Settings
(which you supply to your jOOQ runtime Configuration
重写所有对象引用。同样,您有两个相同的选项:
映射架构名称:
new Settings().withRenderMapping(new RenderMapping()
.withSchemata(new MappedSchema()
.withInput("develop")
.withOutput("stage")
)
);
正在删除所有架构名称:
new Settings().withRenderSchema(false);