开发者问题收集

如何避免在 jOOQ 中用引号括住表别名

2015-01-25
5533

我创建了以下选择查询:

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")
1个回答

关于使用代码生成器的说明

我假设您有充分的理由避免使用代码生成器(例如,您处理动态模式),因为使用生成的代码可以避免担心这些细节。此外,您还可以使用许多高级功能,例如 隐式连接 可嵌入类型 等。

jOOQ API 中的字符串是什么?

默认情况下,jOOQ 会将所有标识符括在引号中,以便能够正确处理大小写敏感问题。

令人困惑的是为什么不对 DSL.field(String) ,但仅适用于 Field.as(String) 。原因是 jOOQ 对以下两种情况重复使用了 String 类型:

  • 普通 SQL ,如 DSL.field(String) ,其中输入的字符串实际上并不代表标识符,而是一个任意的 SQL 表达式
  • 标识符 ,如 DSL.name(String) ,其中输入的字符串代表名称/标识符。还有 DSL.fieldByName(String) 来创建由 (schema) / table / column 标识符组成的 Field 类型。

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

有关 Settings 的更多信息,请点击此处 。此外,在这篇关于 “jOOQ API 中的“字符串”是什么?”的博客文章中,您还可以找到

Lukas Eder
2015-01-26