在 jOOQ 中限定临时 table 列名

Qualifying a temporary table column name in jOOQ

我正在使用 jOOQ 和临时 table:

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

这让我可以编写简单的查询: DSL.select(类型,代币).from(TMP)...

但是,当我尝试加入另一个 table 时,它会产生歧义,因为列名 TYPETOKEN 没有使用 table 名称限定(即我需要生成的代码看起来像 SELECT tmp.type, tmp.token ...)。有没有办法做到这一点,要么让 Jooq 明白临时 table 有特定的列,要么让 Field 有一个合格的名字?

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

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

使用普通 SQL (org.jooq.SQL)

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

通过在每个字段中重复 "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);

通过在普通 SQL 模板中嵌入 "tmp" 引用:

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

The plain SQL functionality is documented here in the manual

使用合格的参考资料(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);

The naming functionality is described here in the manual.

这种方法的优点是: