【问题标题】:jOOQ - add schema name to all tablesjOOQ - 将模式名称添加到所有表
【发布时间】:2015-04-29 19:54:09
【问题描述】:

我正在使用 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>

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

【问题讨论】:

  • 以上文档链接指向不同版本的jOOQ;您使用的是 3.5,您应该尝试使用该文档。不幸的是,示例 (jooq.org/doc/3.5/manual/sql-building/dsl-context/…) 在 3.5 中没有更改。上面的代码应该可以工作。奇数。
  • 我怀疑这是对最近issue #4223 的跟进。您是否使用JDBCDatabaseSQLServerDatabase 来生成您的代码?生成的代码是否引用了myschema 架构?
  • @LukasEder 是的,这是在我使用 SQLServerDatabase 连接到 Azure SQL 以生成代码之后。但是,在我的应用程序中,我不确定我需要在哪里设置它,因为我使用org.apache.tomcat.jdbc.pool.DataSource bean 来创建dataSourcecom.microsoft.sqlserver.jdbc.SQLServerDriver 作为driverClassName。但是,我将sqlDialect 设置为org.jooq.SQLDialect.SQLSERVER。生成的代码在org.jooq.impl.TableImpl的子类中的最后一个私有构造函数中引用了myschema
  • 有趣,您似乎做的一切都正确。更多检查:1)您实际上如何使用 jOOQ 构造查询? 2) 你没有设置Settings.defaultSchema 值?
  • 1) 以下是我创建查询的方法:Configuration config = new DefaultConfiguration(); config.set(new Settings().withRenderSchema(true)); DSL.using(config).selectFrom(MYTABLE); 2) 我也尝试设置 defaultSchema:Configuration config = new DefaultConfiguration(); config.set(new Settings().withRenderMapping(new RenderMapping().withDefaultSchema("myschema")).withRenderSchema(true)); DSL.using(config).selectFrom(MYTABLE); 仍然没有运气

标签: java sql schema jooq


【解决方案1】:

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

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

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

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

这应该可以让您看到列/表名称的呈现位置以及为什么它不是您所期望的。

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

【讨论】:

  • 我在我的代码中发现了这个错误。我使用了 2 组配置 - 一组使用 renderSchema = true,另一组使用 false,当我的 DAO 层 bean 被创建时,一组被另一组覆盖。解决这个问题就解决了。谢谢!
猜你喜欢
  • 2018-12-15
  • 2013-08-13
  • 1970-01-01
  • 2016-08-15
  • 2021-11-25
  • 1970-01-01
  • 2017-11-02
  • 1970-01-01
  • 2014-10-02
相关资源
最近更新 更多