Динамический запрос столбца jsonb в Postgres - PullRequest
0 голосов
/ 14 июля 2020

У меня есть столбец carInfo с типом jsonb в одной из моих таблиц в базе данных PostgreSQL. Примерная строка выглядит примерно так:

{
   "name":"John",
   "age":25,
   "car":{
      "brand":"KIA",
      "year":2015
   }
}

Я знаю, что в PostgreSQL вы можете запросить ее следующим образом:

select * from car where carInfo -> 'name' = 'John'

, но я хотел бы сделать этот запрос динамическим. c (используя функции PostgreSQL или что-то в этом роде), чтобы я мог запросить его из моего Java приложения. Я хочу повторно использовать тот же запрос, даже если я хочу go на уровень глубже, например

select * from car where carInfo -> 'car' -> 'brand' = 'KIA'

Есть идеи, как я могу этого добиться?

1 Ответ

1 голос
/ 14 июля 2020

Вы можете использовать оператор contains @>

select *
from car
where car_info @> '{"name": "John"}';

или

select *
from car
where car_info @> '{"car": {"Brand": "KIA"}}';

В вашем коде Java вы можете написать один PreparedStatement для работы с обоими:

String sql = "select * from car where car_info @> cast(? as jsonb)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "{\"car\": {\"Brand\": \"KIA\"}}";
ResultSet rs = pstmt.executeQuery();

Использование оператора @> имеет дополнительное преимущество: Postgres может использовать индекс (GIN) в этом столбце, что было бы невозможно с цепочкой ->.

...