繁体   English   中英

在带有jsonb列的PostgreSQL中选择查询在JPA中不起作用

[英]select query in postgresql with jsonb column is not working in jpa

我的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"}'

选择查询的输出为“ US”

当我在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();

避免? 运算符,只需检查键是否存在->运算符

通过在postgres中创建函数解决了该问题

CREATE OR REPLACE FUNCTION public.get_metadata(
var1 text,
sort text)
RETURNS TABLE(fldvalue text) 
LANGUAGE 'plpgsql'
COST 100
VOLATILE 
ROWS 1000
AS $BODY$

 BEGIN

  IF(sort='asc') THEN
  RETURN QUERY SELECT distinct metadata->>var1 as fldvalue FROM documents WHERE metadata?var1 order by fldvalue asc;
  ELSE 
  RETURN QUERY SELECT distinct metadata->>var1 as fldvalue FROM documents WHERE metadata?var1 order by fldvalue desc;
  END IF;
END

$BODY$;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM