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:你想做什么INSERT
或UPDATE
?只是普通数据,还是一些 JSON 函数调用?不过,最好问一个新问题。比使用 cmets 更容易回答...
这个答案现在仍然是一个可行的解决方案吗?
@Brunaldo:感谢您的 ping。有点过时了,但在这种特殊情况下,是的,->
运算符等尚不支持。请参阅我的答案中提供的解决方法。以上是关于Jooq Postgres JSON 查询的主要内容,如果未能解决你的问题,请参考以下文章