#java #postgresql #jooq
Вопрос:
Какая поддержка существует для запросов к объектам postgres json с помощью JOOQ?
Например,
SELECT id, data->'author'->>'first_name' as author_first_name FROM books;
Ответ №1:
Многие стандартные операторы SQL/JSON, такие как JSON_ARRAY()
, JSON_OBJECT()
, JSON_ARRAYAGG()
и еще несколько поддерживаются, начиная с jOOQ 3.14.
В настоящее время (по состоянию на jOOQ 3.15) поддержка этих операторов JSON для конкретных поставщиков все еще не реализована: https://github.com/jOOQ/jOOQ/issues/10018
Однако вы всегда можете прибегнуть к использованию обычного 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();
Комментарии:
1. Просто прокомментируйте это. Я понимаю, как использовать обычный SQL для ручной обработки типа данных Postgres JSON, но было бы неплохо, если бы существовал способ получить
UpdatableRecord
поддержку json, даже если немного хакерским способом. Мы используемcreate.newRecord( MY_TABLE, MyPojo )
все время, и я не нашел элегантного способа обработки ВСТАВКИ или ОБНОВЛЕНИЯ для столбцов json.2. @JoshPadnick: Чем
INSERT
быUPDATE
вы хотели заниматься или хотели бы заниматься? Просто обычные данные или какие-то вызовы функций JSON? Однако лучше всего задать новый вопрос. На это будет легче ответить, чем с комментариями…3. является ли этот ответ все еще жизнеспособным решением сейчас?
4. @Брунальдо: Спасибо за сообщение. Немного устарел, но в данном конкретном случае, да,
->
оператор и подобные ему еще не поддерживаются. Посмотрите обходные пути, предлагаемые в моем ответе.