如何让jOOQ引用保留关键字的表名?

5

在使用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是否有一个配置属性来转义表名(所有或只是保留关键字)?我在文档或源代码中找不到任何相关信息。


你不应该在首位使用需要引用的标识符。 - user330315
2
这很好,但假设1)我有选择权,2)我愿意为了琐碎的语法原因而牺牲我的模型的纯度。 - coudy
1个回答

3

你可以通过设置RenderNameStyle.LOWER来关闭引用功能... 就是这样 :)

如果将此设置删除或将其设置为RenderNameStyle.QUOTED,jOOQ将在所有标识符周围生成双引号。

参考规范:

<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:我不会在这个说法上下太多赌注:“引用和大小写是完全独立的问题”。毕竟,在大多数数据库中,引用使标识符对大小写敏感,而未引用的标识符对大小写不敏感。你为什么需要首先将名称转换为小写? - Lukas Eder
@coudy:嗯,肯定还有改进的空间。我们会考虑的:https://github.com/jOOQ/jOOQ/issues/5909 - Lukas Eder
1
哦,很好的例子。H2默认情况下是大写/不区分大小写,而PostgreSQL默认情况下是小写/不区分大小写。引用标识符会使它们在两个数据库中区分大小写。一种前进的方式是编写您的H2 DDL引用/小写。这样,jOOQ代码生成器将正确地拾取大小写(即与PostgreSQL相同),并且它将正常工作。还有其他选项,但对于评论来说太复杂了。如果您提出一个新问题,我很乐意列出几个替代方案。 - Lukas Eder
1
抱歉,我的意思是通过基于文件的DDL生成器使用H2。不过现在已经可以工作了,感谢那些设置(使用AS-IS)。 - J. Dimeo
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接