【发布时间】:2014-09-23 23:14:39
【问题描述】:
对于使用 JOOQ 查询 postgres json 对象有什么支持?
例如,
SELECT id, data->'author'->>'first_name' as author_first_name FROM books;
【问题讨论】:
标签: json postgresql jooq
对于使用 JOOQ 查询 postgres json 对象有什么支持?
例如,
SELECT id, data->'author'->>'first_name' as author_first_name FROM books;
【问题讨论】:
标签: json postgresql jooq
从 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。
如果您使用大量这些 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();
【讨论】:
UpdatableRecord 支持 json 会很好,即使是以一种有点生硬的方式。我们一直使用create.newRecord( MY_TABLE, MyPojo ),但我还没有找到一种优雅的方式来处理 json 列的 INSERT 或 UPDATE。
INSERT或UPDATE?只是普通数据,还是一些 JSON 函数调用?不过,最好问一个新问题。比使用 cmets 更容易回答...
-> 运算符等尚不支持。请参阅我的答案中提供的解决方法。