在jOOQ中限定临时表列名称

时间:2015-11-11 18:30:07

标签: java mysql sql jooq

我正在使用带有临时表的jOOQ:

Member.Free

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

但是,当我尝试连接另一个表时,它会产生歧义,因为列名Table<Record> TMP = DSL.table("tmp"); Field<String> TYPE = DSL.field("type", String.class); Field<String> TOKEN = DSL.field("token", String.class); TYPE没有使用表名限定(即我需要生成的代码看起来像{ {1}})。有没有办法让这种情况发生,或者通过让Jooq了解临时表有某些列,或者使TOKEN具有限定名称?

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

1 个答案:

答案 0 :(得分:3)

在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

这种方法的优点是: