Jooq在生成的查询中动态更改db的架构

时间:2017-06-09 10:45:24

标签: java sql jooq

我在简单数据库中有两个类似的模式 - “develop”和“stage”。我已经使用Jooq为其中一个模式生成了Java类(例如“develop”)。当jooq向db生成查询时,它会隐式地将模式的名称添加到所有查询的别名

select "develop"."image"."id", "develop"."image"."image_data" 
from "develop"."image" 
where "develop"."image"."id" = ?

所以我的问题是,是否有办法在生成的查询中更改jooq模式名称(以“stage”为例)而不重新生成jooq的“stage”模式类?

1 个答案:

答案 0 :(得分:7)

您有几个选项,甚至可以合并:

使用代码生成器的架构映射功能

如果您想避免将"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(您提供给jOOQ运行时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/