使用 jooq 更新 hstore 字段



有谁知道是否可以使用 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>(例如 StringPGobject)。

有关如何使用 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...
}

最新更新