我有以下选择查询创建:
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")发布于 2015-01-26 07:43:48
关于使用代码生成器的说明
我假设您有很好的理由避免使用代码生成器(例如,您处理动态模式),因为使用生成的代码可以避免担心这些细节。此外,您还可以访问许多高级特性,如隐式联接、可嵌入类型等。
jOOQ API中的字符串是什么?
默认情况下,jOOQ将所有标识符封装在引号中,以便正确处理区分大小写的问题。
令人困惑的是,为什么这不是针对DSL.field(String),而是只针对Field.as(String)。造成这种情况的原因是jOOQ对这两种类型都重新使用了字符串类型:
DSL.field(String)一样,输入字符串实际上并不代表标识符,而是一个任意的SQL表达式。DSL.name(String)一样,输入字符串表示名称/标识符。还有DSL.fieldByName(String)来创建由(模式)/表/列标识符组成的Field类型。为了从所有生成的标识符中删除引号,还可以将Settings.renderNameStyle更改为RenderNameStyle.AS_IS。
可以在这里找到。也在这篇关于https://blog.jooq.org/2020/04/03/whats-a-string-in-the-jooq-api/的博文中
https://stackoverflow.com/questions/28138434
复制相似问题