【问题标题】:Qualifying a temporary table column name in jOOQ在 jOOQ 中限定临时表列名
【发布时间】:2016-02-12 22:45:02
【问题描述】:

我正在使用带有临时表的 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,这是我迄今为止一直在做的事情。

【问题讨论】:

    标签: java mysql sql jooq


    【解决方案1】:

    在 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.

    这种方法的优点是:

    【讨论】:

    • 太棒了。感谢您写出如此清晰透彻的答案!
    猜你喜欢
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2019-06-05
    • 2019-01-10
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多