【发布时间】: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 的跟进。您是否使用
JDBCDatabase或SQLServerDatabase来生成您的代码?生成的代码是否引用了myschema架构? -
@LukasEder 是的,这是在我使用
SQLServerDatabase连接到 Azure SQL 以生成代码之后。但是,在我的应用程序中,我不确定我需要在哪里设置它,因为我使用org.apache.tomcat.jdbc.pool.DataSourcebean 来创建dataSource,com.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);仍然没有运气