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

在jOOQ中限定一个临时表列名

郜联
2023-03-14
问题内容

我正在使用jOOQ和一个临时表:

Table<Record> TMP = DSL.table("tmp");
Field<String> TYPE = DSL.field("type", String.class);
Field<String> TOKEN = DSL.field("token", String.class);

这使我可以编写简单的查询:DSL.select(TYPE,TOKEN).from(TMP)…

但是,当我尝试针对另一个表进行联接时,由于列名TYPE并且TOKEN不具有表名的限制(即,我需要生成的代码看起来像SELECT tmp.type, tmp.token ...),这会造成歧义。是否可以通过使Jooq理解temp表具有某些列,或通过Field使用具有限定名称的a来实现此目的?

当然,对于查询的这些部分,我总是可以使用原始SQL,这是我到目前为止所做的。


问题答案:

在jOOQ中有两种与表/列动态交互的方式(即,不使用代码生成器):

使用普通SQL(org.jooq.SQL

那就是你在做什么。显然,您可以Field通过两种方式直接在普通SQL 引用中限定列:

通过"tmp"在每个字段中重复字符串

Table<Record> TMP = DSL.table("tmp");
Field<String> TYPE = DSL.field("tmp.type", String.class);
Field<String> TOKEN = DSL.field("tmp.token", String.class);

通过将"tmp"引用嵌入到普通的SQL模板中:

Table<Record> TMP = DSL.table("tmp");
Field<String> TYPE = DSL.field("{0}.type", String.class, TMP);
Field<String> TOKEN = DSL.field("{0}.token", String.class, TMP);

普通的SQL功能在手册中有说明

使用合格的参考(org.jooq.Name

那可能就是您想要做的。您会写:

Table<Record> TMP = DSL.table(DSL.name("tmp"));
Field<String> TYPE = DSL.field(DSL.name("tmp", "type"), String.class);
Field<String> TOKEN = DSL.field(DSL.name("tmp", "token"), String.class);

命名功能在手册中进行了描述。

这种方法的优点是:

  • 没有SQL注入风险
  • 区分大小写
  • 表映射和其他AST转换也将起作用


 类似资料:
  • 当使用JOOQ为SQLServer数据库生成代码时,生成会创建由三部分组成的限定符,如:。这正是我在使用SQL服务器数据库时想要的,但是当使用生成的代码与另一个数据库(如内存数据库中的H2)进行单元测试时,这是一个问题。 H2方言不支持这些由三部分组成的限定词,H2期望类似于[目录]。[表]。这会在针对H2执行以下命令时导致语法错误: 为了解决这个问题,我需要在运行时更改限定符,我认为可以使用渲染

  • 问题内容: 临时表中的记录是否有限制。.我尝试使用130万条记录..将来我可能要根据应用程序的要求处理数十亿条记录。.可能吗?如果我能知道记录的限制,那么我可以尝试从源数据库中拆分记录,并在限制范围内进行管理。提前致谢 问题答案: tempdb与任何其他数据库之间的差异很小,尤其是在限制方面。 如果可以将其存储在用户表中,那么也可以将其存储在临时表中。它不需要放入RAM,因为tempdb像其他任何

  • 我正在尝试编写更长的函数:[a]- 在我为它提供一个无限的列表之前(更长[1..]例如,10),它将陷入某种无限循环,无法完成运行。所以问题是,有没有一种方法可以定义它,如果它得到一个无限列表,它只会返回True,而不会试图计算整个结果?提前谢谢

  • DefaultRecordMapper可以处理列表吗? 模型示例(实际使用了getter/setter): 我首先用一个简单的选择进行了尝试: 我也尝试过使用嵌套语法,但没有成功: 列表永远不会初始化。我不确定我是否做错了什么。DefaultRecordMapper可以做到这一点吗? 我知道jOOQ提供了“intoGroups”之类的功能。然而,这意味着我们公司不能使用我们现有的模型。 或者在这种

  • 在进行jOOQ不可知(无代码生成)迁移时,我遇到了一种情况,需要检查数据库中是否存在约束(唯一的外键),以便完成进一步的操作。 到目前为止,我尝试的是运行drop并尝试捕获异常,但它使事务失败,并停止后续迁移 设置: Spring jOOQ无需代码生成 FlywayDB作为迁移库 Postgres

  • 主要内容:示例,删除临时表关系型数据库支持临时表,这是一项很棒的功能。临时表的概念由 SQL Server 引入,用来存储和处理中间结果。 临时表在会话期间创建,会话结束后自动被删除。临时表可以和普通表一样执行各种操作,比如 SELECT、UPDATE、INSERT、JOIN 等。 MySQL 3.23 及其更高版本才支持临时表,如果您使用的 MySQL 版本低于 3.23,则不能使用临时表,但可以使用堆表(Heap Ta