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,当然!)

我认为这是最适合你的选择

这里有更多详细信息: https://www.jooq.org/doc/latest/manual/code-generation/codegen-advanced/codegen-config-catalog-and-schema-mapping/

使用运行时间模式映射功能

您可以保持生成的代码不变,并在 运行 时使用 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);

这里有更多详细信息: https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-render-mapping/