首页 > 解决方案 > 将 sql 自定义例程与 jooq 一起使用时数据类型不兼容

问题描述

在实现使用自定义 SQL 函数的 upsert 时,我遇到了以下错误:

[ERROR] /home/user/company/ahqjava/sql/src/main/java/com/company/project/sql/daos/ExampleDAO.java:[60,56] no suitable method found for mergeData(org.jooq.TableField<com.company.project.sql.jooq.tables.records.ExampleRecord,java.util.Map<java.lang.String,java.lang.String>>,java.util.Map<java.lang.String,java.lang.String>)[ERROR]     method com.company.project.sql.jooq.Routines.mergeData(java.util.Map<java.lang.String,java.lang.String>,java.util.Map<java.lang.String,java.lang.String>) is not applicable
[ERROR]       (argument mismatch; org.jooq.TableField<com.company.project.sql.jooq.tables.records.ExampleRecord,java.util.Map<java.lang.String,java.lang.String>> cannot be converted to java.util.Map<java.lang.String,java.lang.String>)
[ERROR]     method com.company.project.sql.jooq.Routines.mergeData(org.jooq.Field<java.util.Map<java.lang.String,java.lang.String>>,org.jooq.Field<java.util.Map<java.lang.String,java.lang.String>>) is not applicable
[ERROR]       (argument mismatch; java.util.Map<java.lang.String,java.lang.String> cannot be converted to org.jooq.Field<java.util.Map<java.lang.String,java.lang.String>>)

自定义 SQL 函数 merge_data() 如下所示:

CREATE OR REPLACE FUNCTION merge_data(left_data hstore, right_data hstore)
  RETURNS HSTORE AS $$
    SELECT (left_data || right_data)
     $$
   LANGUAGE SQL;

这是当前的 jooq DSL

return DSL.using(configuration)
        .insertInto(EXAMPLE)
        .columns(EXAMPLE.EXAMPLE_ID, EXAMPLE.EXAMPLE_DATA)
        .values(EXAMPLE.getExampleId(), example.getExampleData())
        .onDuplicateKeyUpdate()
        .set(EXAMPLE.EXAMPLE_DATA, Routines.mergeData(EXAMPLE.EXAMPLE_DATA, example.getExampleData())

        )
       .execute();

Example example是一个 POJO。

为了完整起见,这是我用来调用函数的方法:

    @Test
    public void upsertTestDifferentExampleData() {
        Example example = createExample();
        jooq.transaction(cfg -> {

            dao.upsert(example, cfg);

        });


    }

有人可以建议一种方法来消除这种参数冲突吗?

编辑:这是我的强制类型配置

types.add(new ForcedType()
                .withUserType("java.util.Map<String, String>")
                .withBinding("HStoreStringBinding")
                .withIncludeExpression(".*_data.*")
                .withIncludeTypes(".*"));

        types.add(new ForcedType()
                .withUserType("java.util.Map<String, Long>")
                .withBinding("HStoreLongBinding")
                .withIncludeExpression(".*_counts")
                .withIncludeTypes(".*"));

标签: javasqlpostgresqljooq

解决方案


推荐阅读