如何使用 JOOQ 查询生成器构建使用常量值的 select 语句的插入



我有一个插入语句,它插入了一些常量值,它需要通过查找从其他表中选择一些引用键。查询如下所示。

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>>

不知何故,一旦我在选择返回类型中使用内联,就会更改为选择条件步骤而不是选择。

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

编译器推断SelectConditionStep的事实在这里无关紧要,因为它是Select的一个子类型,因此对于INSERT .. SELECT语句来说是完全可以接受的。问题是,当在insertInto()子句中使用纯SQL并且不提供任何列数据类型时,编译器将推断每个单独的列Object,而不是String

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

dslContext
.insertInto(
table("repository.buffer"),
field("b_external_id", String.class), // Change here
field("b_buffer_type_id"),
field("b_entrypoints", Object.class), // Change here
field("b_site_id"),
field("b_state", String.class), // Change here
field("b_uri", String.class)) // Change here
.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();

或者更好的是,使用代码生成器,在这种情况下,所有这些都将自动为您完成,从而提高可读性。

最新更新