如何在jOOQ中避免表别名的引号

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)

Luk*_*der 9

默认情况下,jOOQ会将所有标识符包装在引号中,以便能够正确处理区分大小写.

令人困惑的部分是为什么不这样做DSL.field(String),而只是为了Field.as(String).原因是jOOQ重新使用String类型:

  • 纯SQLDSL.field(String),其中输入字符串并没有真正代表的标识符,但一个SQL表达式
  • 标识符作为DSL.name(String),其中输入的字符串表示一个名称/标识.还有DSL.fieldByName(String)创建Field由(模式)/表/列标识符组成的类型.

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

有关更多信息,请Settings点击此处.