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

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

最佳答案

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

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

jOOQ API 中的字符串是什么?

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

令人困惑的部分是为什么不为 DSL.field(String) 完成此操作, 但仅适用于 Field.as(String) .这样做的原因是 jOOQ 为两者重新使用了 String 类型:

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

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

More information about Settings can be found here .并且在这篇关于 "What’s a “String” in the jOOQ API?" 的博文中

关于java - 如何避免 jOOQ 中表别名的引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28138434/

相关文章:

git - git 别名的名称中可以包含句点 (.) 吗?

Java检测循环有向图

java - 使用 commons-cli 创建子命令

java - Nutch 爬行不适用于特定 URL

java - 为什么jframe不显示按钮?

mysql - 使用外部键引用插入到选择中

c# - 使用 .NET 中的类型化数据集将 SQL 参数传递给 IN() 子句

mysql - 如何从mysql动态表中获取两列

sql - 为包含 access 中的联接的子查询指定别名

android - 无法获取 facebook sdk 哈希 key 。