当前位置: 首页 > 知识库问答 >
问题:

使用Hibernate Postgres jsonb

孔扬
2023-03-14

我有下面的Postgres查询,当通过psql客户端运行时可以很好地工作-

select id,jbag 
from mydb.mytable e 
where (e.jbag->'myCodes')::jsonb @> '{"C":"C", "T":"T", "L":"L"}';

然而,当我通过创建org.hibernate.query对象来运行查询时,我得到了一个类似于这样的异常-

psqlexception:错误:运算符不存在:jsonb@>字符变化提示:没有与给定名称和参数类型匹配的运算符。您可能需要添加显式类型转换。职位:144

请帮帮忙。我读了以下关于创建一个新类型的帖子,并且Hibernate不支持postgres JSON操作符-

http://www.thoughts-on-java.org/persist-postgresqls-jsonb-data-type-hibernate/

但是有没有一个简单的解决方法呢?

谢谢

共有2个答案

鄢开诚
2023-03-14

带有prepare语句的工作代码:

WhereObj whereObj = new WhereObj();
StringBuilder where = new StringBuilder(" where ");
...
// inside cycle
where.append(" file_object\\:\\:jsonb @> ?\\:\\:jsonb ");
whereObj.params.add(jsonStr);
...
whereObj.sql = where.toString();

以后的用法:

    Query nativeQuery = em.createNativeQuery(
       "select * from file_object f " 
          + whereObj.sql + sortSQL, 
        FileObjectEntity.class
    );
    setParameters(nativeQuery, whereObj);
    List<FileObjectEntity> resultList = nativeQuery.getResultList();

方法SetParameters:

private void setParameters(Query nativeQuery, WhereObj whereObj) {
    for (int i=0, n=whereObj.params.size(); i<n; i++) {
        nativeQuery.setParameter(i + 1, whereObj.params.get(i));
    }
}


private class WhereObj {
    private String sql = StringUtils.EMPTY;
    private ArrayList<String> params = new ArrayList<>();
}
黎玺
2023-03-14

我在postgres中使用json_build_object运算符来构造一个JSON对象并将其用在查询中解决了这个问题-

select id,jbag 
from mydb.mytable e 
where (e.jbag->'myCodes')\\:\\:jsonb @> json_build_object(:jsonStr)\\:\\:jsonb;

我将上面的查询字符串存储在一个Java StringBuffer对象中,如下所示-

StringBuilder buf=new StringBuilder();buf.append(“Select.....

.....append(“(e.jbag->'my codes')\:\:jsonB@>json_build_object(:jsonStr)\:\:jsonB”)

其中jsonStr是一个Java字符串对象,定义如下-

String jsonStr = new String("'C', 'C', 'T', 'T'");

请原谅我没有发布完整的查询--我的实际查询相当长。注意double\用来转义双冒号

然后使用Hibernate setParameter方法在查询中设置对象-

query2.setParameter(“jsonStr”,jsonStr);

其中query2是我的org.hibernate.session对象,最后调用了query对象上的list方法-

List<String> statusCodeList = query2.list();

下面是关于运营商的postgres文档页面-

https://www.costgresql.org/docs/9.4/statig/functions-json.html

 类似资料:
  • 有没有办法在使用 jongo 查询 MongoDB 时添加 ?我发现这样的错误 - '排序超出了 104857600 字节的内存限制,但没有选择加入外部排序。正在中止操作。传递 allowDiskUse:true 可以选择加入,可以通过以下方式阻止,您的聚合看起来像 但据我所知,Jongo 中的类仅将管道应用于自身,然后您可以使用 方法执行。 是否有任何方法可以将该参数传递给mongo而不从Jon

  • 问题内容: 我在远程服务器上有一个管理Web应用程序。该应用程序是使用MEAN堆栈编写的,我列出了连接到Web应用程序所需的所有RESTful路由。 我正在编写一个Java客户端应用程序,该应用程序需要从该管理应用程序发送和接收数据。如果我具有服务器的IP地址和REST路由,如何将客户端连接到Web应用程序? 我想我需要提供到服务器和REST API文件的URL连接,然后仅调用诸如和的路由功能。

  • 问题内容: 我使用spring数据和方法来获取模型。调用此方法时如何使用查询提示? 上面的源代码工作正常,但是我不能为我的JPA提供程序(在我的情况下为EclipseLink)设置QueryHint。 以上是我使用spring-data使用查询提示的方式, 我还发现了这个尚未解决的问题。 问题答案: 当我想使用spring-data创建查询时,请遵循上述算法。 1)是否已经提供的查询 通过弹簧数据

  • 我使用spring数据和方法获取模型。调用此方法时如何使用查询提示 上面的源代码运行良好,但我无法为我的JPA提供者(在我的例子中是EclipseLink)设置QueryHint。 我使用spring数据使用查询提示的方式如下:, 我也发现这个还没有解决。

  • 通过io的requestAbs方法调用/调用/使用REST API的vertx实现。vertx。果心http。vertx-core-3.2.0中的HttpClient类。jar导致HTTP错误::302,响应数据为HTML Erro响应。 不确定requestAbs方法的行为,因为没有引发异常,也没有写入任何日志。此外,还随附了使用vertx JAR的此方法的源代码。如果方法实现有bug,是否有问

  • 问题内容: 说我有: 我该如何使用表单外部的“提交”按钮提交该表单,我认为在HTML5中有一个“提交”的动作属性,但是我不确定那是否是完全跨浏览器的,如果不是这样的话,做这个? 问题答案: 一个对我来说很好的解决方案,在这里仍然缺少。它需要具有目视隐藏或元件whithin的,和相关的它元件外部。它看起来像这样: 现在,此链接使您可以通过单击元素来“单击”表单元素。

  • 在Hamcrest中有没有一种方法可以比较一个数字范围内的一个数字?我在找这样的东西:

  • 首先创建一个静态页面 index.html 和一个 JS 入口文件 entry.js: <!-- index.html --> <html> <head> <meta charset="utf-8"> </head> <body> <script src="bundle.js"></script> </body> </html> // entry.js document.write('It