如何在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")) 

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)没有这样做的DSL.field(String) ,但仅适用于Field.as(String) 。 原因是jOOQ重新使用String类型:

  • 简单SQL,如DSL.field(String) ,其中输入String实际上不表示标识符,而是任意SQL表达式
  • DSL.name(String) 标识符 ,其中输入String表示名称/标识符。 还有DSL.fieldByName(String)来创建由(模式)/表/列标识符组成的Field类型。

要从所有生成的标识符中删除引号,还可以将Settings.renderNameStyle更改为RenderNameStyle.AS_IS

有关Settings更多信息,请访问此处 。

    Interesting Posts