我正在使用带有临时表的 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 明白临时表有特定的列,要么用限定名称创建一个 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 .
这种方法的优点是:
关于java - 在 jOOQ 中限定临时表列名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33657391/