Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java postgresql中带jsonb列的select查询在jpa中不起作用_Java_Sql_Postgresql_Jpa_Jdbc - Fatal编程技术网

Java postgresql中带jsonb列的select查询在jpa中不起作用

Java postgresql中带jsonb列的select查询在jpa中不起作用,java,sql,postgresql,jpa,jdbc,Java,Sql,Postgresql,Jpa,Jdbc,我的postgres表中有一个jsonb列。我正在使用的select查询是 SELECT distinct metadata->'Country' as metadata FROM documents WHERE metadata?'Country' order by metadata->'Country' asc 它在postgresql中运行良好。元数据列中的数据如下 '{"Country":"US","Vendor":"ABC","Year":"2011"}' select

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

SELECT distinct metadata->'Country' as metadata FROM documents WHERE metadata?'Country' order by metadata->'Country' asc
它在postgresql中运行良好。元数据列中的数据如下

'{"Country":"US","Vendor":"ABC","Year":"2011"}'
select查询的输出为“US”

在jpa中使用此查询时,select查询中使用的“?”有一个问题,因为它需要一个参数

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(
“选择distinct cast(元数据->“+title+”)作为来自元数据为“+title+”的文档的元数据,按元数据排序->“+title+”+”+排序);
List obj=query.getResultList();

如何解决此问题?

我假设jpa不理解
运算符-您可以尝试使用smth解决此问题,如
元数据->'Country'不为空
?例如:

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(
“选择distinct cast(元数据->“+title+”)作为文档中的元数据,其中元数据按元数据->“+title+”+排序顺序排列);
List 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();
Query Query=this.em.createNativeQuery(
“选择distinct cast(元数据->“+title+”)作为来自元数据->“+title+””按元数据->“+title+”+排序不为空的文档的元数据”;
List obj=query.getResultList();

为了避免使用
运算符,只需检查
->
运算符的密钥是否存在,我假设jpa不理解
运算符-您可以尝试使用smth解决它,如
元数据->'Country'不为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(
“选择distinct cast(元数据->“+title+”)作为文档中的元数据,其中元数据按元数据->“+title+”+排序顺序排列);
List 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();
Query Query=this.em.createNativeQuery(
“选择distinct cast(元数据->“+title+”)作为来自元数据->“+title+””按元数据->“+title+”+排序不为空的文档的元数据”;
List 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$;

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

不能使用准备好的语句占位符来配置查询的结构。只传递值。因此,您可以使用
where foo.bar=:someValue
,但不能使用
where foo.:someProp=2
@JBNizet I删除所有参数并提供内联。但是“?”仍然是一个问题。预期位置参数计数:1,实际参数:[]我假设jpa不理解
运算符-您可以使用函数I解决它guess@VaoTsun功能?你能给出一个例子吗?在下面的回答中给出了一个例子-你可以通过明确检查顶级键的值是否为null来检查它是否存在。你不能使用一个准备好的语句占位符来配置查询的结构。只传递值。因此,您可以使用
where foo.bar=:someValue
,但不能使用
where foo.:someProp=2
@JBNizet I删除所有参数并提供内联。但是“?”仍然是一个问题。预期位置参数计数:1,实际参数:[]我假设jpa不理解
运算符-您可以使用函数I解决它guess@VaoTsun功能?你能举个例子吗?在下面的答案中给出了一个例子-你可以通过明确检查顶级键的值是否为null来检查它是否存在。我不明白你的意思也显示出同样的问题。我不明白你的意思也显示出同样的问题。你能用我的问题解释一下吗