首页 文章

在jOOQ中限定临时表列名称

提问于
浏览
2

我正在使用带有临时表的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)...

但是,当我尝试连接另一个表时,它会产生歧义,因为列名 TYPETOKEN 没有使用表名限定(即我需要生成的代码看起来像 SELECT tmp.type, tmp.token ... ) . 有没有办法让这种情况发生,或者通过让Jooq了解临时表有某些列,或者使用带有限定名称的 Field

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

1 回答

  • 2

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

    使用纯SQL(org.jooq.SQL)

    那个's what you'正在做 . 显然,您可以通过两种方式直接在纯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 .

    这种方法的优点是:

相关问题