在postgresql中使用jsonb列选择查询不在jpa中工作

问题描述:

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

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

它从postgresql正常工作。在元数据colummn数据就像是选择查询的

'{"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(); 

我该如何解决这个问题?

+0

不能使用准备好的语句占位符配置查询的结构功能解决了这个问题。只传递值。所以你可以使用'where foo.bar =:someValue',而不是'where foo.:someProp = 2'。 –

+0

@JBNizet我删除了所有参数并内联给出。但'?'仍然是一个问题。预期的位置参数计数:1,实际参数:[] –

+0

我假设jpa不包含'?'运算符 - 你可以用函数来解决它我猜 –

通过创建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$; 

我假设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(); 

避免?运营商,只是检查是与存在关键运营商

+0

我不明白你的意思。'::'也显示相同的问题。你能解释我的查询吗? –