Hibernate与Postgres的jsonb

4

我有下面的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: ERROR: operator does not exist: jsonb @> character varying Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts. Position: 144
请帮忙。我已阅读有关创建新类型以及 Hibernate 不支持 postgres JSON 运算符的以下文章。

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

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

谢谢


这里的答案可能有所帮助: https://dev59.com/EL3pa4cB1Zd3GeqPWQgx#72679167 - Evgeny Umansky
2个回答

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

......append("(e.jbag->'myCodes')\:\:jsonb @> json_build_object(:jsonStr)\:\:jsonb ")

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

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

抱歉我没有发布完整的查询 - 我的实际查询非常长。请注意使用双反斜杠来转义双冒号

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

query2.setParameter("jsonStr", jsonStr);

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

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

以下是PostgreSQL文档页面关于运算符的内容 -

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接