2016-11-09 56 views
2

jsonb我有下面的Postgres的查詢時,通過psql客戶端可以運行工作正常 -Postgres的使用Hibernate

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:運營商不存在:jsonb @>字符改變 提示:沒有運營商的指定名稱和參數類型相匹配。您可能需要添加顯式類型轉換。 位置:144

請幫忙。我已閱讀下面的帖子有關創建一個新的類型和Hibernate不支持Postgres的JSON運營商 -

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

但有一個簡單的解決方案?

感謝

回答

1

我使用json_build_object運營商在Postgres而言,要構建一個JSON對象,並在這樣的查詢中使用它解決了這個問題 -

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

我存儲在上面的查詢字符串在Java StringBuffer對象像這樣 -

StringBuilder buf = new StringBuilder(); (「選擇.....

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

其中jsonStr是這樣定義的Java String對象 -

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

原諒我沒有張貼完整的查詢 - 我實際的查詢是相當長的注意用來逃跑的雙重\。雙冒號

然後使用休眠的setParameter方法來設置物體在查詢 -

query2.setParameter(「jsonStr」,jsonStr);

其中QUERY2是我的org.hibernate.Session對象,最後打電話查詢對象的列表方法 -

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

下面是關於運營商的Postgres文檔頁面 -

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