【问题标题】:Update hstore fields using jooq使用 jooq 更新 hstore 字段
【发布时间】:2015-03-07 23:29:00
【问题描述】:

有谁知道是否可以使用 JOOQ 在 hstore 中通过键更新值,除了执行普通 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

可以使用JOOQ的DSL吗?

【问题讨论】:

    标签: java sql postgresql jooq hstore


    【解决方案1】:

    这很有可能,但还没有开箱即用的支持。为了实现您自己的 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...
    }
    

    【讨论】:

      猜你喜欢
      • 2022-08-24
      • 1970-01-01
      • 2016-10-26
      • 2020-06-06
      • 2020-12-02
      • 2020-07-19
      • 2022-01-17
      • 2016-12-16
      • 2015-08-02
      相关资源
      最近更新 更多