jooq-向所有表添加模式名

u1ehiz5o  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(527)

我正在使用jooq3.5.4来生成代码和查询,以及一个azuresql数据库。有没有一种方法可以在所有查询(运行时)或代码生成过程中用模式名来前置表名?我目前只有一个模式(我们称之为myschema)和一些表(我们称其中一个为mytable)。目前,当jooq创建它生成的查询时:

  1. select * from mytable;

这无法与azure sql一起使用,因为它在查询中需要架构名称,如下所示:

  1. select * from myschema.mytable;

虽然运行时架构Map不是为此目的创建的,但我也尝试过:
http://www.jooq.org/doc/3.5/manual/sql-building/dsl-context/runtime-schema-mapping/
通过给予

  1. Settings settings = new Settings()
  2. .withRenderMapping(new RenderMapping()
  3. .withSchemata(
  4. new MappedSchema().withInput("myschema")
  5. .withOutput("myschema")));

这似乎不管用。
我还尝试在代码生成器使用的xml中添加模式名称,如中所示
http://www.jooq.org/doc/3.5/manual/code-generation/codegen-advanced/
我的xml是这样的:

  1. <database>
  2. .....
  3. <inputSchema>myschema</inputSchema>
  4. <outputSchema>myschema</outputSchema>
  5. <schemata>
  6. <schema>
  7. <inputSchema>myschema</inputSchema>
  8. <outputSchema>myschema</outputSchema>
  9. </schema>
  10. </schemata>
  11. </database>

这也没用。有什么建议吗?

3pvhb19x

3pvhb19x1#

尝试 settings.withRenderSchema(true) . 如果您只有一个模式,那么jooq会对此进行优化,因为大多数数据库都可以处理这种情况。
请注意,代码生成器中使用的模式与您的案例基本无关。Map用于将一些您无法控制的奇数名称转换为有用的名称(例如 FQ475 进入 MASTER ). jooq把这个名字写进代码里。然后你可以使用 RenderMapping 将此内部名称转换为目标数据库使用的架构名称。
如果不起作用,就在上设置断点 getSQL(true) 在下面的代码中:

  1. Configuration config = new DefaultConfiguration();
  2. config.set(new Settings().withRenderSchema(true));
  3. DSL.using(config)
  4. .selectFrom(MYTABLE)
  5. .getSQL(true);

这应该允许您查看列/表名的呈现位置以及为什么它不是您所期望的。
当您发现这个bug时,我建议添加一个最小的单元测试,它显示了如何配置jooq以使其正确。这样,当问题再次出现时,您可以将实际设置与您可以证明有效的设置进行比较。

相关问题