gpt4 book ai didi

java - 在 jOOQ 中限定临时表列名

转载 作者:可可西里 更新时间:2023-11-01 08:11:06 25 4
gpt4 key购买 nike

我正在使用带有临时表的 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,这是我目前所做的。

最佳答案

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com