Jooq 计数方法被反引号包裹
Jooq count method getting wrapped in backticks
我最近将一个项目的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
您可能在这个问题中指定了 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版本从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
您可能在这个问题中指定了 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
将覆盖它。