【发布时间】:2020-07-19 09:22:39
【问题描述】:
目前,我正在尝试在 jooq 中实现以下 sql 查询:
INSERT INTO table as t (id, hstore_data)
VALUES ('test', '"key1" => "val1"')
ON CONFLICT (id)
DO UPDATE SET hstore_data = add(t.hstore_data, '"keyX" => "valX"');
add() 是一个自定义函数:
CREATE FUNCTION add(hstore, hstore) RETURNS hstore
AS 'select $1 || $2;'
LANGUAGE SQL
IMMUTABLE
RETURNS NULL ON NULL INPUT;
到目前为止,我已成功启动并运行它:
return DSL.using(configuration)
.insertInto(TABLE)
.columns(TABLE.ID, TABLE.HSTORE_DATA)
.values(table.getId(), table.getHstoreData())
.onDuplicateKeyUpdate()
.set(TABLE.HSTORE_DATA,
merge(
DSL.using(configuration).select(TABLE.HSTORE_DATA).from(TABLE).where(TABLE.ID.eq(table.getId())).fetchAnyInto(HashMap.class)
, table.getHstoreData()
)
)
.execute();
merge() 是一个简单的 JAVA 函数,合并两个地图。
这种方法有效。但是,我想按照第一个查询的建议在数据库服务器上进行所有处理。
我尝试使用 jooq 为 add() 生成的例程。但似乎 jooq 不使用 hstore 绑定。绑定在 ConfigGenerator 中定义如下:
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(".*"));
绑定适用于 hstores,但不适用于自定义函数。
- 还有更聪明的方法吗?
- add() 输入不正确的原因可能是什么?
- 如何告诉 jooq 在合并中使用原始值,就像在原始 SQL 查询中使用 t.hstore_data 一样?
【问题讨论】:
-
不相关,但是:您实际上不需要定义自己的
add()函数。您可以简单地使用hs_concat(),它是hstore 的||运算符的实现。 -
@a_horse_with_no_name 确实,我曾经想过尝试,但又忘记了。谢谢!
标签: java sql postgresql jooq