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

标签 java postgresql jooq

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

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。

有解决这个问题的线索吗?

最佳答案

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

请记住,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();

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

关于java - 如何使用 JOOQ 查询生成器构建使用常量值的 Insert into with select 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52104695/

相关文章:

postgresql - 如何从选择中的完整路径获取文件名?

django - 使用 PostgreSQL 的 m2m 字段偶尔出现完整性错误

java - Intellij IDEA : How to set up Imported Maven Project Correctly?

java - 有没有办法在事先不知道列名的情况下动态生成JOOQ sql语句?

java - 单击按钮时将 JLabel 转换为计时器

Java:如何检查字段是否为 java.util.Collection 类型

java - 如何在 Java Scanner 前面添加前缀?

postgresql - 使用没有密码的 psql 命令运行批处理文件

postgresql - 执行 PostgreSQL 的 concat() 而不是 || 的方法在JOOQ?

java - GitHub android app如何强制认证?