在Postgres中动态查询jsonb列

时间:2020-07-14 12:29:11

标签: java sql postgresql jdbc jsonb

我在PostgreSQL数据库的一个表中有一个列carInfo,列jsonb。示例行如下所示:

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

我知道在PostgreSQL中,您可以通过以下方式查询它:

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

但是我想使该查询动态化(通过使用PostgreSQL函数或其他方法),以便可以从Java应用程序中查询它。我想重用相同的查询,即使当我想更深入一点时也是如此

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

有什么想法可以实现吗?

1 个答案:

答案 0 :(得分:1)

您可以使用包含运算符@>

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)索引,而->链则无法实现。