Обновите поля hstore с помощью jooq

Кто-нибудь знает, возможно ли обновить значение по ключу в hstore с помощью 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

Можно ли это сделать с помощью DSL JOOQ?


person Dmitry Krivenko    schedule 09.01.2015    source источник


Ответы (1)


Вполне возможно, но пока не поддерживается из коробки. Чтобы реализовать собственную поддержку HSTORE, вам потребуется:

1. Внедрите org.jooq.Binding

Эта привязка будет использоваться для всех столбцов HSTORE в вашей базе данных. Он позаботится об обработке взаимодействия вашего типа пользователя <U> (например, Map<String, String>) с JDBC, чтобы создать тип базы данных <T> (например, String или PGobject).

Пример того, как это сделать с типом 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...
}
person Lukas Eder    schedule 10.01.2015