Типы данных несовместимы при использовании пользовательской подпрограммы sql с jooq - PullRequest
0 голосов
/ 15 апреля 2020

При реализации upsert, который использует пользовательскую функцию SQL, я столкнулся со следующей ошибкой:

[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);

        });


    }

Может кто-нибудь предложить подход, чтобы избавиться от этого параметра cla sh?

Редактировать: Вот мой конфиг принудительного типа

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(".*"));
...