我有以下选择查询创建:
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")
默认情况下,jOOQ会将所有标识符包装在引号中,以便能够正确处理区分大小写的情况。
令人困惑的部分是为什么这么做并不是为了做到DSL.field(String)
而是为了做到Field.as(String)
。原因是jOOQ对这两种方法都重复使用了String类型:
DSL.field(String)
,其中输入的String并不真正表示标识符,而是任意的SQL表达式DSL.name(String)
,其中输入String表示名称/标识符。还DSL.fieldByName(String)
可以创建Field
由(模式)/表/列标识符组成的类型。为了从所有生成的标识符中删除引号,您还可以将更Settings.renderNameStyle
改为RenderNameStyle.AS_IS
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句