Jooq动态更改生成查询中的数据库模式

12

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

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

所以我的问题是,是否有一种方法可以在生成的查询中更改jooq模式名称(例如对于“stage”),而无需重新生成“stage”模式的jooq类?

1个回答

20

你有几个选项,甚至可以组合使用:

使用代码生成器的模式映射功能

如果你想避免将"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>
      ...

现在,这将从生成的代码中删除任何模式引用,因此生成的类可以在所有模式上运行(当然,请确保使用正确的连接和搜索路径!)

我认为这是您最好的选择

更多详情请查看: 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/


我认为最好的机制是在代码生成时使用<outputSchemaToDefault>true</outputSchemaToDefault>。这样,以后基于您的连接查询将在任何数据库上运行。 - Chathurika Sandarenu
@ChathurikaSandarenu 这取决于您如何设置模式以及您喜欢的工作方式。幸运的是,所有这些选项都是可能的,因此每个人都可以选择最适合自己的选项。 - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接