Jooq Postgres JSON 查询

Posted

技术标签:

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

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

例如,

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

【问题讨论】:

【参考方案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; 运算符等尚不支持。请参阅我的答案中提供的解决方法。

以上是关于Jooq Postgres JSON 查询的主要内容,如果未能解决你的问题,请参考以下文章

带有jooq的postgres数组范围表示法

如何在带有 jOOQ 的 WHERE 条件下使用 Postgres JSON 运算符?

使用 JOOQ 查询 mysql 中的 json 字段

Jooq 无法找到 postgres 数据库的驱动程序

Jooq 与 SQL Server 如何选择前 N 个结果

如何使用 JOOQ 使用 H2 为 PostGres 生成存根 - ENUM 类型