Postgres jsonb with Hibernate

时间:2016-11-09 16:24:22

标签: java postgresql hibernate

我有下面的Postgres查询,它在通过psql客户端运行时工作正常 -

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

但是,当我通过创建org.Hibernate.query对象来运行查询时,我得到一个类似于此的异常 -

org.postgresql.util.PSQLException:错误:运算符不存在:jsonb @>性格变化   提示:没有运算符匹配给定的名称和参数类型。您可能需要添加显式类型转换。   位置:144

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

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

但是有一个简单的解决方案吗?

由于

2 个答案:

答案 0 :(得分:1)

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

......追加("(e.jbag->' myCodes')\:\:jsonb @> json_build_object(:jsonStr)\:\:jsonb& #34)

其中jsonStr是一个像这样定义的Java String对象 -

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

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

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

query2.setParameter(" jsonStr",jsonStr);

其中query2是我的org.Hibernate.Session对象,最后在查询对象上调用list方法 -

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

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

https://www.postgresql.org/docs/9.4/static/functions-json.html

答案 1 :(得分:0)

使用准备声明

的工作代码
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<>();
}