提问者:小点点

使用Hibernate Postgres jsonb


我有下面的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个答案

匿名用户

我在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

匿名用户

带有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<>();
}