编程语言
首页 > 编程语言> > java-在jOOQ中限定临时表列名

java-在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.选择(TYPE,TOKEN).from(TMP)…

但是,当我尝试对另一个表进行联接时,由于列名TYPE和TOKEN不符合表名的限制(即,我需要生成的代码看起来像SELECT tmp.type,tmp.token …),这会造成歧义. .是否可以通过使Jooq理解temp表具有某些列,或通过使用限定名称的Field来实现此目的?

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

解决方法:

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

使用普通SQL(org.jooq.SQL)

那就是你在做什么.显然,您可以通过两种方式直接在普通SQL字段引用中限定列:

通过在每个字段中重复“ 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.

这种方法的优点是:

> No SQL injection risk
>区分大小写
> Table mapping and other AST transformations will work, too

标签:jooq,sql,java,mysql
来源: https://codeday.me/bug/20191119/2036276.html