【问题标题】:How to make jOOQ quote table names that are reserved keywords?如何使 jOOQ 引用表名作为保留关键字?
【发布时间】:2017-07-15 06:36:09
【问题描述】:

在使用 jOOQ 从名为 user 的表中进行选择时,出现以下异常:

jOOQ; bad SQL grammar [insert into user (user_id, account_type) values (?, ?)]; nested exception is org.postgresql.util.PSQLException: ERROR: syntax error at or near "user"

我的 jOOQ 设置是:

private static final Settings jooqSettings = new Settings()
    .withRenderSchema(false)
    .withRenderNameStyle(RenderNameStyle.LOWER);

我从中创建一个DSLContext 并在事务中构造一个查询,如下所示:

ctx.insertInto(USER)
      .set(USER.USER_ID, userId)
      .set(USER.ACCOUNT_TYPE, "U")
      .execute()

USER 被导入为<jooq-generated-package>.tables.USER

jOOQ 是否有一个配置属性来转义表名(所有或只是保留关键字)?我在文档或源代码中找不到任何内容。

【问题讨论】:

  • 您不应该首先使用需要引用的标识符
  • 这很好,但假设 1) 我有一个选择,并且 2) 我愿意为了一个与语法相关的小原因牺牲我的模型的纯度。

标签: java sql postgresql jooq


【解决方案1】:

好吧,你通过设置 RenderNameStyle.LOWER 关闭了引用...这就是它的工作原理:)

通过删除该设置或将其设置为RenderNameStyle.QUOTED,jOOQ 将在所有标识符周围生成这些双引号。

来自specification

<simpleType name="RenderNameStyle">
  <restriction base="string">
    <!--
     Render object names quoted, as defined in the database. Use this
     to stay on the safe side with case-sensitivity and special
     characters. For instance:
     Oracle    : "SYS"."ALL_TAB_COLS"
     MySQL     : `information_schema`.`TABLES`
     SQL Server: [INFORMATION_SCHEMA].[TABLES] 
     -->
    <enumeration value="QUOTED"/>

    <!--
     Render object names, as defined in the database. For instance:
     Oracle    : SYS.ALL_TAB_COLS
     MySQL     : information_schema.TABLES
     SQL Server: INFORMATION_SCHEMA.TABLES 
     -->
    <enumeration value="AS_IS"/>

    <!--
     Force rendering object names in lower case. For instance:
     Oracle    : sys.all_tab_cols
     MySQL     : information_schema.tables
     SQL Server: information_schema.tables 
     -->
    <enumeration value="LOWER"/>

    <!--
     Force rendering object names in upper case. For instance:
     Oracle    : SYS.ALL_TAB_COLS
     MySQL     : INFORMATION_SCHEMA.TABLES
     SQL Server: INFORMATION_SCHEMA.TABLES 
     -->
    <enumeration value="UPPER"/>
  </restriction>
</simpleType>

请注意,有功能要求向 Javadoc (#2830) 和手册 (#5231) 添加更多文档

【讨论】:

  • 感谢您的规范,我错过了!我想我希望有一种方法可以同时做到这一点——引用和大小写毕竟是正交的问题。底线是 jOOQ 正在生成无效的 SQL。您认为值得提交错误吗?
  • @coudy:我不会在这个说法上赌太多钱:“引用和大小写毕竟是正交的问题”。毕竟,当未引用的标识符(在大多数数据库中)不区分大小写时,引用使标识符(在大多数数据库中)区分大小写。为什么你首先需要小写你的名字?
  • @coudy:嗯,当然还有一些改进的余地。我们会考虑:github.com/jOOQ/jOOQ/issues/5909
  • 嗯,很好的例子。 H2 默认为大写/不区分大小写,而 PostgreSQL 默认为小写/不区分大小写。引用标识符使它们在两个数据库中都区分大小写。一种前进的方法是编写您的 H2 DDL 引用/小写。这样,jOOQ 代码生成器将“正确”地选择大小写(即在 PostgreSQL 中)并且它会工作。还有其他选择,但评论太复杂了。如果您提出新问题,我会很乐意列出几个备选方案。
  • 对不起,这就是我的意思——通过基于文件的 DDL 生成器使用 H2。多亏了这些设置(使用原样),它现在可以工作了。
猜你喜欢
  • 1970-01-01
  • 2017-01-15
  • 2017-12-05
  • 2019-06-26
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多