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

标签 java mysql sql jooq

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

相关文章:

php - 设置mysql "search"页面

java - Windows上的Hadoop:获取异常 “not a valid DFS filename”

java - Play 框架 2.2.X 上的对象修改不一致

java - @PreAuthorize 在一个方法上调用但在另一个方法上不调用

mysql - 在JDO中定义基于哈希的索引

php - 如何进一步过滤mysql中的GROUP BY记录?

sql - 在忽略大小写和特殊字符的两列中查找可能的重复项

sql - MYSQL SELECT WITHIN IF 语句

java - Android 数据库崩溃

php - 从表中获取值并将该值提交到另一个表 mysql php