如何避免在 jOOQ 中引用 table 别名
How to avoid quotes around table aliases in jOOQ
我有以下 select- 查询创建:
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 中完美运行。 table 别名不应用引号引起来。
这是一个错误吗?
(请注意,查询非常愚蠢。我正在使用 jOOQ 进行评估。)
以下 "hack" 作品:
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")
使用代码生成器的注意事项
我假设您有充分的理由避免使用代码生成器(例如,您在动态模式上工作),因为使用生成的代码可以避免担心这些细节。此外,您还可以使用许多高级功能,例如 implicit joins, embeddable types 等
jOOQ 中的字符串是什么 API?
默认情况下,jOOQ 会将您的所有标识符括在引号中,以便能够正确处理区分大小写。
令人困惑的部分是为什么 DSL.field(String)
, but only for Field.as(String)
没有这样做。这样做的原因是 jOOQ 对两者都重新使用了 String 类型:
- Plain SQL 与
DSL.field(String)
中一样,其中输入字符串并不真正表示标识符,而是任意 SQL 表达式
- Identifiers as in
DSL.name(String)
, where the input String represents a name / identifier. There is also DSL.fieldByName(String)
创建 Field
由(架构)/table / 列标识符组成的类型。
为了从所有生成的标识符中删除引号,您还可以更改 Settings.renderNameStyle
to RenderNameStyle.AS_IS
。
More information about Settings
can be found here. And also in this blog post about "What’s a “String” in the jOOQ API?"
我有以下 select- 查询创建:
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 中完美运行。 table 别名不应用引号引起来。
这是一个错误吗?
(请注意,查询非常愚蠢。我正在使用 jOOQ 进行评估。)
以下 "hack" 作品:
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")
使用代码生成器的注意事项
我假设您有充分的理由避免使用代码生成器(例如,您在动态模式上工作),因为使用生成的代码可以避免担心这些细节。此外,您还可以使用许多高级功能,例如 implicit joins, embeddable types 等
jOOQ 中的字符串是什么 API?
默认情况下,jOOQ 会将您的所有标识符括在引号中,以便能够正确处理区分大小写。
令人困惑的部分是为什么 DSL.field(String)
, but only for Field.as(String)
没有这样做。这样做的原因是 jOOQ 对两者都重新使用了 String 类型:
- Plain SQL 与
DSL.field(String)
中一样,其中输入字符串并不真正表示标识符,而是任意 SQL 表达式 - Identifiers as in
DSL.name(String)
, where the input String represents a name / identifier. There is alsoDSL.fieldByName(String)
创建Field
由(架构)/table / 列标识符组成的类型。
为了从所有生成的标识符中删除引号,您还可以更改 Settings.renderNameStyle
to RenderNameStyle.AS_IS
。
More information about Settings
can be found here. And also in this blog post about "What’s a “String” in the jOOQ API?"