Jooq 计数方法被反引号包裹

Posted

技术标签:

【中文标题】Jooq 计数方法被反引号包裹【英文标题】:Jooq count method getting wrapped in backticks 【发布时间】:2022-01-12 22:15:56 【问题描述】:

我最近将一个项目的 jooq 版本从 3.13.5 更新到 3.14.15。我已经重新运行了 jooq-codegen。我正在使用 mysql 5.7。

运行我的一项测试时 - 它执行DAOImpl.exists。该调用会产生以下异常:

org.jooq.exception.DataAccessException: SQL [select `count`(*) from `users` where `users`.`id` = ?]; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*) from `users` where `users`.`id` = 1094' at line 1

    at org.jooq_3.14.15.MYSQL.debug(Unknown Source)
    at org.jooq.impl.Tools.translate(Tools.java:2903)
    at org.jooq.impl.DefaultExecuteContext.sqlException(DefaultExecuteContext.java:757)
    at org.jooq.impl.AbstractQuery.execute(AbstractQuery.java:389)
    at org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:453)
    at org.jooq.impl.AbstractResultQuery.fetchLazy(AbstractResultQuery.java:422)
    at org.jooq.impl.AbstractResultQuery.fetchLazyNonAutoClosing(AbstractResultQuery.java:436)
    at org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:613)
    at org.jooq.impl.AbstractResultQuery.fetchOne(AbstractResultQuery.java:565)
    at org.jooq.impl.SelectImpl.fetchOne(SelectImpl.java:3034)
    at org.jooq.impl.DAOImpl.existsById(DAOImpl.java:300)
    at org.jooq.impl.DAOImpl.exists(DAOImpl.java:288)

问题是count 有反引号。应该是select count(*) from `users` where `users`.`id` = ?

有没有人遇到过这个问题并且知道如何解决它? TIA

【问题讨论】:

【参考方案1】:

您可能指定了RenderQuotedNames.ALWAYS 并遇到了这个问题? https://github.com/jOOQ/jOOQ/issues/9931

ALWAYS 的设置具有误导性。它实际上意味着永远,尽管人们可能将其读作ALWAYSISH_I_E_ONLY_WHEN_IT_MAKES_SENSE。可能是命名设计错误,但您想要的是EXPLICIT_DEFAULT_QUOTED,请参阅文档: https://www.jooq.org/doc/latest/manual/sql-building/dsl-context/custom-settings/settings-name-style/

RenderQuotedNames

ALWAYS:这将引用所有标识符。 EXPLICIT_DEFAULT_QUOTED:这将引用所有标识符,这些标识符没有使用DSL.unquotedName() 明确取消引用。 EXPLICIT_DEFAULT_UNQUOTED:这不会引用任何标识符,除非使用 DSL.quotedName() 明确引用它们。 NEVER:这不会引用任何标识符。

DSL.count() 中的COUNT 是一个明确不带引号的名称,ALWAYS 将覆盖它。

【讨论】:

以上是关于Jooq 计数方法被反引号包裹的主要内容,如果未能解决你的问题,请参考以下文章

jOOQ - 别名和引号错误

如何在使用 jooq 创建查询字符串时转义单引号?

实例成员:计算属性 监听属性以及vue的项目开发

golang数据类型值之字符串

javascript中的字符串

JavaScript 中反引号 (`) 的使用