在 jOOQ 中限定临时表列名

Tro*_*roy 4 java mysql sql jooq

我将 jOOQ 与临时表一起使用:

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

这允许我编写简单的查询:DSL.select(TYPE, TOKEN).from(TMP)...

但是,当我尝试连接另一个表时,它会产生歧义,因为列名TYPETOKEN没有用表名限定(即我需要生成的代码看起来像SELECT tmp.type, tmp.token ...)。有没有办法实现这一点,要么让 Jooq 了解临时表具有某些列,要么通过使用Field限定名称来创建 a ?

当然,对于查询的这些部分,我始终可以使用原始 SQL,这就是我到目前为止一直在做的事情。

Luk*_*der 5

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);
Run Code Online (Sandbox Code Playgroud)

通过将引用嵌入"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);
Run Code Online (Sandbox Code Playgroud)

简单的 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);
Run Code Online (Sandbox Code Playgroud)

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

这种方法的优点是: