java - 使用 jsonb 列在 postgresql 中选择查询在 jpa 中不起作用

标签 java sql postgresql jpa jdbc

我的 postgres 表中有一个 jsonb 列。我正在使用的选择查询是

SELECT distinct metadata->'Country' as metadata FROM documents WHERE metadata?'Country' order by metadata->'Country' asc

它在 postgresql 中运行良好。元数据列中的数据就像

'{"Country":"US","Vendor":"ABC","Year":"2011"}'

选择查询的输出是“美国”

当我在 jpa 中使用此查询时,'?' 出现问题在选择查询中使用,因为它需要一个参数。

Query query = this.em.createNativeQuery(
            "SELECT distinct cast(metadata->"+title+") as metadata FROM documents WHERE metadata?"+title+" order by metadata->"+title+" "+sort);
    List<Object> obj=query.getResultList(); 

我该如何解决这个问题?

最佳答案

我假设 jpa 不理解 ? 运算符 - 您可以尝试使用诸如 metadata->'Country' is not null 之类的方法解决它?例如:

t=# with j(b) as (values('{"a":0}'::jsonb))
t-# select b from j
t-# where b ? 'a';
    b
----------
 {"a": 0}
(1 row)

t=# with j(b) as (values('{"a":0}'::jsonb))
t-# select b from j
t-# where b->'a' is not null;
    b
----------
 {"a": 0}
(1 row)

t=# with j(b) as (values('{"a":0}'::jsonb))
t-# select b from j
t-# where b->'not exising' is not null;
 b
---
(0 rows)

更新

基于评论和您的查询:

Query query = this.em.createNativeQuery(
            "SELECT distinct cast(metadata->"+title+") as metadata FROM documents WHERE metadata ?? "+title+" order by metadata->"+title+" "+sort);
    List<Object> obj=query.getResultList();

使用转义和另一个:

Query query = this.em.createNativeQuery(
            "SELECT distinct cast(metadata->"+title+") as metadata FROM documents WHERE metadata->'"+title+"' is not null order by metadata->"+title+" "+sort);
    List<Object> obj=query.getResultList();

为了避免 ? 运算符,只检查 -> 运算符是否存在 key

关于java - 使用 jsonb 列在 postgresql 中选择查询在 jpa 中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46420831/

相关文章:

mysql - MySQL中两列的MAX

ruby-on-rails - 为字段创建 PostgreSQL 序列(不是记录的 ID)

java - 从日期列表中获取所有缺失的日期(已排序)

java - 基于GWT的开源电子商务解决方案

java - 向前循环的问题

sql - sql server更新查询中的if条件

mysql - 多列上没有空值的 SQL 连接

java - 亚行——它是如何运作的?

sql索引同列两个方向遍历窗口函数

sql - 'AS'在SQL中是什么意思?