当前位置: 首页 > 面试题库 >

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

归翔
2023-03-14
问题内容

我有以下选择查询创建:

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

问题答案:

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

令人困惑的部分是为什么这么做并不是为了做到DSL.field(String)而是为了做到Field.as(String)。原因是jOOQ都将String类型重新用于这两个类型:

  • 如中的普通SQL所示DSL.field(String),其中输入的String并不真正表示标识符,而是任意的SQL表达式
  • 如中的标识符DSL.name(String),其中输入String表示名称/标识符。还DSL.fieldByName(String)可以创建Field由(模式)/表/列标识符组成的类型。

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

有关更多信息,请Settings参见此处。



 类似资料:
  • 问题内容: 我遇到一种情况,我试图在Postgres中创建一个名为“ user”的表,由于Hibernate没有将表名放在引号中而引发了错误: 尽管指定了它应在DataSource.groovy中使用PostgreSQLDialect,但是: 在处理Postgres时,如何配置Hibernate在表名周围加引号? 问题答案: 您可以在带反引号的块中引用表名。Hibernate会将其转换为基于Dia

  • 我需要从一个非常大的表中选择一个“页”的数据。由于WHERE子句和需要分页到相当大的偏移量,我使用一个子查询来获取ID。只有在末尾放置时,此策略才有效。这导致(我认为)到数据库的额外往返。有什么方法可以避免额外的? 附言。我这样做的原因是由于orderBy/offset/limit用于大偏移量(我选择的列之一由于是blob类型,不适合添加到索引中,所以我不能创建覆盖索引)。

  • 但是这两种方法都不起作用(第一种方法导致ParseeRoreXception,第二种方法在传递给方法的值中产生双反斜杠)。

  • 我在PostgreSQL数据库中定义了一个类型和一个视图。 使用3.7版本上的代码生成,我得到了一个UDT记录类和一个表记录类,以及UDT POJO类和表POJO类。 生成的类有一个数组。 而在POJO中,我希望有一系列POJO,例如: 另一个有趣的事实是,pojo和类型的记录在文件夹中,而对于视图,它们在文件夹中:也许这有助于找到解决方案/解释。 根据要求,我附上了一个工作示例,该示例生成了我所

  • 我试图在Laravel中加入3个表后查看特定表的日期。但是它只显示一个表的信息。 下面是连接3个表的代码: 路由文件: 下面是查看刀片模板中信息的脚本 刀片中的代码: 这里我想查看发票的创建日期,但它显示了subscribers表中订户的创建日期。但我想从发票表中查看发票的具体日期。 我该怎么做?当做

  • 我的自定义UIViewController子类具有存储的闭包属性。闭包签名被定义为采用相同类型的类的单个参数: ...这个想法是,对象将自己作为处理程序的参数传递回去,有点像UIAlertAction初始化器。 此外,为了方便起见,我有一个工厂类方法: ...它执行以下操作: 创建视图控制器的实例, 将完成处理程序分配给属性, 在调用时从顶部/根视图控制器以模态方式呈现它。 我的视图控制器肯定在泄