【问题标题】:How to avoid quotes around table aliases in jOOQ如何避免 jOOQ 中表别名的引号
【发布时间】:2015-03-24 04:13:41
【问题描述】:

我有以下选择查询创建:

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

【问题讨论】:

    标签: java sql alias jooq


    【解决方案1】:

    使用代码生成器的注意事项

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

    jOOQ API 中的字符串是什么?

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

    令人困惑的部分是为什么这不适用于DSL.field(String),而仅适用于Field.as(String)。这样做的原因是 jOOQ 对两者都重用了 String 类型:

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

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

    More information about Settings can be found here。还有这篇关于"What’s a “String” in the jOOQ API?"的博客文章

    【讨论】:

      猜你喜欢
      • 2018-11-07
      • 2014-11-16
      • 2019-09-03
      • 1970-01-01
      • 2021-12-25
      • 1970-01-01
      • 2015-07-31
      • 2021-06-30
      • 2016-05-26
      相关资源
      最近更新 更多