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

时间:2015-01-25 16:09:31

标签: 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"))

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进行评估。)

以下" 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")

1 个答案:

答案 0 :(得分:9)

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

令人困惑的部分是DSL.field(String)未执行此操作的原因,但仅适用于Field.as(String)。原因是jOOQ重新使用String类型:

  • Plain SQLDSL.field(String)中一样,其中输入String并不真正表示标识符,而是任意SQL表达式
  • IdentifiersDSL.name(String)中一样,其中输入String表示名称/标识符。还有DSL.fieldByName(String)来创建由(架构)/表/列标识符组成的Field类型。

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

More information about Settings can be found here