如何在jOOQ中用SELECT指定插入列实现INSERT INTO操作?
解决jOOQ生成INSERT语句时无法添加字段列表的问题
问题场景
使用jOOQ生成INSERT...SELECT语句时,当前生成的SQL未包含字段列表,期望生成INSERT INTO MY_TABLE(firstField, secondField)的形式,但实际输出如下:
insert into MY_TABLE -- 期望写成INSERT INTO(firstField,secondField) select ?, ? where not exists ( select 1 from MY_TABLE where ( firstField = ? ) ) returning id
MY_TABLE表结构
create table IF NOT EXISTS MY_TABLE ( id SERIAL PRIMARY KEY, firstField int not null, secondField int not null )
初始构建代码
JooqBuilder.default() .insertInto(table("MY_TABLE")) .select( select( param(classOf[Int]), // 1 param(classOf[Int]), // 2 ) .whereNotExists(select(inline(1)) .from(table("MY_TABLE")) .where( DSL.noCondition() .and(field("firstField", classOf[Long]).eq(0L)) ) ) ).returning(field("id")).getSQL
尝试过的方法
曾尝试显式指定字段,但因类型不匹配编译失败:
.insertInto(table("MY_TABLE"),field("firstField"), field("secondField"))
最终解决方案
为insertInto中的字段指定匹配的类型后,编译通过并生成了预期的SQL:
JooqBuilder.default() .insertInto(table("MY_TABLE"), field("firstField",classOf[Int]), field("secondField",classOf[Int]) ) .select( select( param(classOf[Int]), param(classOf[Int]) ) .whereNotExists(select(inline(1)) .from(table("MY_TABLE")) .where( DSL.noCondition() .and(field("firstField", classOf[Long]).eq(0L)) ) ) ).returning(field("id")).getSQL
原因说明
jOOQ会从insertInto方法中获取字段类型,若后续select语句返回的字段类型不匹配则会触发编译异常。之前未指定字段类型导致类型不匹配,为字段显式指定Int类型后,与select中的参数类型一致,jOOQ成功生成带字段列表的INSERT语句。
内容的提问来源于stack exchange,提问作者Capacytron
相关产品推荐
相关产品推荐

