Jef*_*son 6 java sql alias jooq
我有以下选择查询创建:
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"))
Run Code Online (Sandbox Code Playgroud)
jOOQ生成以下查询:
select
identifier,
name,
(select count(*)
from person
where identifier = personOuter.identifier) as "count"
from person as "personOuter"
Run Code Online (Sandbox Code Playgroud)
查询应该是:
select
identifier,
name,
(select count(*)
from person
where identifier = personOuter.identifier) as "count"
from person as personOuter
Run Code Online (Sandbox Code Playgroud)
后一种查询在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")
Run Code Online (Sandbox Code Playgroud)
默认情况下,jOOQ会将所有标识符包装在引号中,以便能够正确处理区分大小写.
令人困惑的部分是为什么不这样做DSL.field(String),而只是为了Field.as(String).原因是jOOQ重新使用String类型:
DSL.field(String),其中输入字符串并没有真正代表的标识符,但一个SQL表达式DSL.name(String),其中输入的字符串表示一个名称/标识.还有DSL.fieldByName(String)创建Field由(模式)/表/列标识符组成的类型.要从所有生成的标识符中删除引号,您还可以更改Settings.renderNameStyle为RenderNameStyle.AS_IS.