使用jooq更新hstore字段

3

有人知道在使用JOOQ时是否可以通过键值更新中的值,而不是执行纯SQL语句吗?例如,我有一个名为products的表。

 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

我想通过键key3更新值。为此,我可以执行纯SQL:

UPDATE products SET name='test1New', characs=characs || '"key3"=>"value3"'::hstore where id=1

使用JOQQ的DSL可以实现吗?
1个回答

3
这是完全可能的,但目前还不支持开箱即用。要实现自己的 HSTORE 支持,您需要执行以下操作:

1. 实施 org.jooq.Binding

此绑定将用于数据库中的所有 HSTORE 列。它将负责处理您的用户类型<U>(例如Map<String, String>)与 JDBC 的交互,以生成数据库类型<T>(例如StringPGobject)。

这里可以看到使用JSON类型的示例:

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...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接