我有下面的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/
但是有一个简单的解决方案吗?
由于
答案 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<>();
}