我正在使用jOOQ 3.5.4进行代码生成和查询生成以及Azure SQL数据库。有没有办法在所有查询中(在运行时)或在代码生成过程中在表名前添加架构名?我目前只有一个模式(我们称其为myschema)和一些表(我们将其中之一称为mytable)。当前,当jOOQ创建查询时,它将产生:

select * from mytable;


这无法与Azure SQL一起使用,因为它希望在查询中使用架构名称,如下所示:

select * from myschema.mytable;


尽管没有为此目的创建运行时模式映射,但我也尝试过:

http://www.jooq.org/doc/3.5/manual/sql-building/dsl-context/runtime-schema-mapping/

通过给予

Settings settings = new Settings()
.withRenderMapping(new RenderMapping()
.withSchemata(
    new MappedSchema().withInput("myschema")
                      .withOutput("myschema")));


这似乎没有用。

我还尝试将模式名称添加到代码生成器使用的xml中,如

http://www.jooq.org/doc/3.5/manual/code-generation/codegen-advanced/

这是我的xml的样子:

<database>
 .....
  <inputSchema>myschema</inputSchema>
  <outputSchema>myschema</outputSchema>

  <schemata>
    <schema>
      <inputSchema>myschema</inputSchema>
      <outputSchema>myschema</outputSchema>
    </schema>
  </schemata>
</database>


这也没有帮助。有什么建议么?

最佳答案

尝试settings.withRenderSchema(true)。如果您只有一个模式,则jOOQ会对其进行优化,因为大多数数据库都可以处理这种情况。

请注意,代码生成器中使用的架构与您的情况几乎无关。映射用于将您没有任何控制权的某些奇数名称转换为有用的内容(例如FQ475MASTER)。 jOOQ将此名称放入代码中。然后,您可以使用RenderMapping将此内部名称转换为目标数据库使用的架构名称。

如果那不起作用,请在下面的代码中的getSQL(true)上设置一个断点:

Configuration config = new DefaultConfiguration();
config.set(new Settings().withRenderSchema(true));
DSL.using(config)
.selectFrom(MYTABLE)
.getSQL(true);


这应该使您能够看到列/表名的显示位置以及为什么它不是您期望的。

当您发现错误时,我建议添加一个最小的单元测试,以显示如何配置jOOQ使其正确。这样,当问题再次出现时,您可以将实际设置与可以证明可行的设置进行比较。

关于java - jOOQ-将架构名称添加到所有表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29919830/

10-13 07:32