Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用JOOQ查询生成器构建使用常量值的Insert into with select语句_Java_Postgresql_Jooq - Fatal编程技术网

Java 如何使用JOOQ查询生成器构建使用常量值的Insert into with select语句

Java 如何使用JOOQ查询生成器构建使用常量值的Insert into with select语句,java,postgresql,jooq,Java,Postgresql,Jooq,我有一个insert语句,它插入一些常量值,需要通过查找从其他表中选择一些引用键。这个查询看起来像这样 Insert into repository.buffer ( b_external_id, b_buffer_type_id, b_entrypoints, b_site_id, b_state, b_uri) select '100A',bt_id,'["/locations/100A"]'::jsonb,s_id,'ready','/buf

我有一个insert语句,它插入一些常量值,需要通过查找从其他表中选择一些引用键。这个查询看起来像这样

Insert into repository.buffer (
    b_external_id,
    b_buffer_type_id,
    b_entrypoints,
    b_site_id,
    b_state,
    b_uri)
select '100A',bt_id,'["/locations/100A"]'::jsonb,s_id,'ready','/buffers/100A'
from  repository.site, repository.buffer_type
where s_name = 'bar'
and bt_external_id = 'FOO';
我的JOOQ查询生成器代码如下所示

dslContext
            .insertInto(
                table("repository.buffer"),
                field("b_external_id"),
                field("b_buffer_type_id"),
                field("b_entrypoints"),
                field("b_site_id"),
                field("b_state"),
                field("b_uri"))
            .select(select(
                    inline(null, String.class),
                    field("bt_id"),
                    inline(null, Object.class),
                    field("s_id"),
                    inline(null, String.class),
                    inline(null, String.class))
                    .from(table("repository.site"), table("repository.buffer_type"))
                    .where(field("s_name").eq(cast(null, String.class)))
                    .and(field("bt_external_id").eq(cast(null, Integer.class))))
                .onConflict().doNothing()
            .getSQL();
此语句无法编译,错误如下

Error:(98, 25) java: incompatible types: org.jooq.SelectConditionStep<org.jooq.Record6<java.lang.String,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.String,java.lang.String>> cannot be converted to org.jooq.Select<? extends org.jooq.Record6<java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object,java.lang.Object>>
当我在select中使用inline时,select的返回类型将更改为SELECTCONDICTIONSTEP而不是select


有什么线索可以解决这个问题吗?

编译器推断SelectConditionStep的事实与此无关,因为它是Select的一个子类型,因此完全可以接受INSERT。。SELECT语句。问题是,当在insertInto子句中使用纯SQL且不提供任何列数据类型时,编译器将为每个列推断对象,而不是字符串

请记住,jOOQ是一个非常强类型的API,它主要帮助您正确使用SQL。在特定情况下,请确保在每个列引用上指定数据类型:

dslContext .插入 tablerepository.buffer, fieldb_external_id,String.class,//在此处更改 fieldb_buffer_type_id, fieldb_入口点,Object.class,//在此处更改 fieldb_站点id, fieldb_状态,String.class,//在此处更改 fieldb_uri,String.class//在此处更改 。选择Select inlinenull,String.class, fieldbt_id, inlinenull,Object.class, 字段(id),, inlinenull,String.class, inlinenull,String.class .fromtablerepository.site,tablerepository.buffer\u类型 .wherefields\u name.eqcastnull,String.class .andfieldbt_external_id.eqcastnull,Integer.class .无冲突 .getSQL;
或者更好的方法是使用代码生成器,这样所有这些都会自动为您完成,从而提高可读性。

事实上,我在发布问题后一段时间就想出来了,感谢您的及时回答