有谁知道是否可以使用 JOOQ 在 hstore 中按键更新值,除了执行普通 sql。例如,我有餐桌产品
id | characs | name
----+----------------------------------------------------------------------------+--------------
1 | "key"=>"value", "key3"=>"test2" | test1
2 | "key"=>"value" | test3
3 | "keyNew"=>"valueNew" | test3
4 | "keyNew"=>"valueNew" | test4
5 | "date"=>"Dec 2012", "price"=>"500", "author"=>"Dave", "currency"=>"dollar" | test5
我想通过键键3更新值。为此,我可以执行普通的sql:
UPDATE products SET name='test1New', characs=characs || '"key3"=>"value3"'::hstore where id=1
可以使用JOOQ的DSL吗?
这是很有可能的,但尚未开箱即用。为了实施您自己的 HSTORE 支持,您需要:
1. 实施org.jooq.Binding
此绑定将用于数据库中的所有 HSTORE 列。它将负责处理您的用户类型<U>
的交互(例如 Map<String, String>
)与 JDBC,以便生成数据库类型<T>
(例如 String
或PGobject
)。
有关如何使用 JSON
类型执行此操作的示例可以在此处看到:
- 如何使用JOOQ在PostgreSQL中插入带有JSON列的可更新记录?
- http://www.jooq.org/doc/latest/manual/code-generation/custom-data-type-bindings/
HSTORE
类型的工作方式大致相同
2. 通过纯SQL实现自己的运算符
PostgreSQL有很多特定于供应商的运算符,它们与特定于供应商的数据类型一起使用。这些运算符需要通过纯SQL实现。例如:
public class DSLExtensions {
public static Field<String> get(
Field<Map<String, String>> hstore, String key) {
return DSL.field("{0} -> {1}", String.class, hstore, DSL.val(key));
}
public static Field<String[]> get(
Field<Map<String, String>> hstore, String[] keys) {
return DSL.field("{0} -> {1}", String[].class, hstore, DSL.val(keys));
}
public static Field<Map<String, String>> concat(
Field<Map<String, String>> f1,
Field<Map<String, String>> f2) {
return DSL.field("{0} || {1}", f1.getDataType(), f1, f2);
}
// etc...
}