【问题标题】:Jooq Postgres JSON queryJooq Postgres JSON 查询
【发布时间】:2014-09-23 23:14:39
【问题描述】:

对于使用 JOOQ 查询 postgres json 对象有什么支持?

例如,

SELECT id, data->'author'->>'first_name' as author_first_name FROM books;

【问题讨论】:

    标签: json postgresql jooq


    【解决方案1】:

    从 jOOQ 3.14 开始支持许多标准 SQL/JSON 运算符,例如 JSON_ARRAY()JSON_OBJECT()JSON_ARRAYAGG() 等等。

    目前(从 jOOQ 3.15 开始),对这些供应商特定 JSON 运算符的支持仍未实现:https://github.com/jOOQ/jOOQ/issues/10018

    但是,您始终可以使用plain SQL。你的查询可以用 jOOQ 来表达:

    DSL.using(configuration)
       .select(BOOKS.ID, field("{0}->'author'->>'first_name'", 
                           String.class, BOOKS.DATA
                         ).as("author_first_name"))
       .from(BOOKS)
       .fetch();
    

    有关详细信息,请参阅 DSL.field() 方法 javadocs。

    或者,编写自己的迷你 API

    如果您使用大量这些 JSON 路径表示法,您也许可以像这样分解出一个迷你 API:

    public static Field<Object> jsonObject(Field<?> field, String name) {
        return DSL.field("{0}->{1}", Object.class, field, DSL.inline(name));
    }
    
    public static Field<String> jsonText(Field<?> field, String name) {
        return DSL.field("{0}->>{1}", String.class, field, DSL.inline(name));
    }
    

    上面可以这样使用:

    DSL.using(configuration)
       .select(BOOKS.ID, jsonText(jsonObject(BOOKS.DATA, "author"), "first_name")
                         .as("author_first_name"))
       .from(BOOKS)
       .fetch();
    

    【讨论】:

    • 对此发表评论。我了解如何使用普通 SQL 来手动处理 Postgres JSON 数据类型,但如果有办法让 UpdatableRecord 支持 json 会很好,即使是以一种有点生硬的方式。我们一直使用create.newRecord( MY_TABLE, MyPojo ),但我还没有找到一种优雅的方式来处理 json 列的 INSERT 或 UPDATE。
    • @JoshPadnick:你想做什么INSERTUPDATE?只是普通数据,还是一些 JSON 函数调用?不过,最好问一个新问题。比使用 cmets 更容易回答...
    • 这个答案现在仍然是一个可行的解决方案吗?
    • @Brunaldo:感谢您的 ping。有点过时了,但在这种特殊情况下,是的,-&gt; 运算符等尚不支持。请参阅我的答案中提供的解决方法。
    猜你喜欢
    • 2018-04-13
    • 2019-10-16
    • 2021-02-17
    • 2015-07-17
    • 2017-06-01
    • 2017-01-01
    • 1970-01-01
    • 2023-03-16
    相关资源
    最近更新 更多