При реализации 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(".*"));