Java 在jOOQ中限定临时表列名
我将jOOQ与临时表一起使用:Java 在jOOQ中限定临时表列名,java,mysql,sql,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); Table TMP=DSL.Table(“TMP”); 字段类型=DSL.Field(“TYPE”,String.class); 字段
Table<Record> TMP = DSL.table("tmp");
Field<String> TYPE = DSL.field("type", String.class);
Field<String> TOKEN = DSL.field("token", String.class);
Table TMP=DSL.Table(“TMP”);
字段类型=DSL.Field(“TYPE”,String.class);
字段标记=DSL.Field(“标记”,String.class);
这允许我编写简单的查询:
DSL.select(类型、令牌).from(TMP)
但是,当我尝试对另一个表进行连接时,它会产生歧义,因为列名TYPE
和TOKEN
没有表名限定(即,我需要生成的代码看起来像SELECT tmp.TYPE,tmp.TOKEN…
)。有没有办法做到这一点,或者让Jooq了解临时表有某些列,或者用限定名创建一个字段
当然,对于查询的这些部分,我始终可以使用原始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);
使用限定引用(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);
Table TMP=DSL.Table(DSL.name(“TMP”);
字段类型=DSL.Field(DSL.name(“tmp”,“TYPE”),String.class);
fieldtoken=DSL.Field(DSL.name(“tmp”、“TOKEN”)、String.class);
这种方法的优点是:
- 注意区分大小写
在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);
使用限定引用(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);
Table TMP=DSL.Table(DSL.name(“TMP”);
字段类型=DSL.Field(DSL.name(“tmp”,“TYPE”),String.class);
fieldtoken=DSL.Field(DSL.name(“tmp”、“TOKEN”)、String.class);
这种方法的优点是:
- 注意区分大小写
太棒了。谢谢你写了这么清晰透彻的答案!令人惊叹的。谢谢你写了这么清晰透彻的答案!