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