java - 将 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(".*"));
解决方案
推荐阅读
- python - 为什么当我尝试将 .jpg 文件转换为数组时,Google Colab 会使用这么多 RAM?
- windows - Delphi Windows Service 不运行,立即从 Create 转到 Destroy
- python - 如何使用 python 和 BeautifulSoup 获取标签内的文本
- python-3.x - Google Docs API 无法使用 Python 找到 Google Sheet
- mysql - 无法使用 knexjs 创建表
- java - 当您只有 id 时创建映射实体
- c - 为什么我们需要功能测试宏?
- microsoft-graph-api - 当我尝试向频道发送消息时,我收到 HTTP 未经授权的错误?
- mne-python - Is it possible to dynamically update mne.viz.brain from sourceEstimate.plot()?
- c# - 在这种情况下,我应该如何以及何时运行数据库迁移?