如何避免在 jOOQ 中用引号括住表别名
2015-01-25
5533
我创建了以下选择查询:
final DSLContext create = DSL.using(..., SQLDialect.POSTGRES);
create
.select(DSL.field("identifier"), DSL.field("name"),
create.selectCount()
.from(DSL.table("person"))
.where(DSL.field("identifier").eq(DSL.field("personOuter.identifier")))
.asField("count"))
.from(DSL.table("person").as("personOuter"))
jOOQ 生成以下查询:
select
identifier,
name,
(select count(*)
from person
where identifier = personOuter.identifier) as "count"
from person as "personOuter"
查询应为:
select
identifier,
name,
(select count(*)
from person
where identifier = personOuter.identifier) as "count"
from person as personOuter
后一个查询在 PostgreSQL 中运行良好。表别名不应被引号括起来。
这是一个错误吗?
(请注意,该查询非常愚蠢。我正在使用 jOOQ 进行评估。)
以下“黑客”有效:
create
.select(DSL.field("identifier"), DSL.field("name"),
create.selectCount()
.from(DSL.table("person"))
.where(DSL.field("identifier").eq(DSL.field("personOuter.identifier")))
.asField("count"))
.from("person as personOuter")
1个回答
关于使用代码生成器的说明
我假设您有充分的理由避免使用代码生成器(例如,您处理动态模式),因为使用生成的代码可以避免担心这些细节。此外,您还可以使用许多高级功能,例如 隐式连接 、 可嵌入类型 等。
jOOQ API 中的字符串是什么?
默认情况下,jOOQ 会将所有标识符括在引号中,以便能够正确处理大小写敏感问题。
令人困惑的是为什么不对
DSL.field(String)
,但仅适用于
Field.as(String)
。原因是 jOOQ 对以下两种情况重复使用了 String 类型:
-
普通 SQL
,如
DSL.field(String)
,其中输入的字符串实际上并不代表标识符,而是一个任意的 SQL 表达式 -
标识符
,如
DSL.name(String)
,其中输入的字符串代表名称/标识符。还有DSL.fieldByName(String)
来创建由 (schema) / table / column 标识符组成的Field
类型。
为了从所有生成的标识符中删除引号,您还可以将
Settings.renderNameStyle
更改为
RenderNameStyle.AS_IS
。
有关
Settings
的更多信息,请点击此处
。此外,在这篇关于
“jOOQ API 中的“字符串”是什么?”的博客文章中,您还可以找到
Lukas Eder
2015-01-26