2016-11-09 4 views
2

ich die unten Postgres Abfrage haben, die funktioniert gut, wenn durch den psql Client ausgeführt -Postgres jsonb mit Hibernate

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

Allerdings, wenn ich die Abfrage durch die Schaffung eines org.Hibernate.query Objekt laufen lasse, erhalte ich eine Ausnahme ähnlich wie diese -

org.postgresql.util.PSQLException: ERROR: Operator existiert nicht: jsonb @> Zeichen unterschiedlicher Hinweis: kein Operator stimmt mit dem angegebenen Namen und Argumenttyp (en). Möglicherweise müssen Sie explizite Typumwandlungen hinzufügen. Position: 144

Bitte helfen. Ich habe folgenden Beitrag lesen Sie über eine neue Art zu schaffen, und dass Hibernate nicht Postgres JSON Operatoren unterstützen -

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

Aber gibt es eine einfache Lösung?

Dank

Antwort

1

ich dieses Problem mit json_build_object Operator in Postgres gelöst ein JSON-Objekt zu konstruieren und in einer Abfrage wie folgt verwenden -

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

ich die obige Abfrage-String in einem Java String Objekt gespeichert etwas wie das -

StringBuilder buf = neu StringBuilder(); buf.append ("SELECT .....

...... ...... anfügen (" (e.jbag -> 'myCodes') \: \: jsonb @> json_build_object (: jsonStr) \: \ : jsonb „)

wo jsonStr ein Java-String-Objekt wie folgt definiert ist -

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

Pardon für nicht veröffentlichen die vollständige Abfrage - die meine eigentliche Abfrage ist ziemlich lang Notieren Sie sich die Doppel \ verwendet zu entkommen. doppelter Doppelpunkt

Dann verwendet die Hibernate setParameter Methode, um das Objekt in der Abfrage -

query2.setParameter ("jsonStr", jsonStr);

wo query2 mein org.Hibernate.Session Objekt und schließlich die Liste Methode auf dem Abfrage-Objekt aufgerufen -

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

Unten ist die Postgres-Dokumentation Seite über Operatoren -

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

0

Arbeitsstück des Codes mit Vorbereitungserklärung:

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(); 
später

Usage:

Query nativeQuery = em.createNativeQuery(
     "select * from file_object f " 
      + whereObj.sql + sortSQL, 
     FileObjectEntity.class 
    ); 
    setParameters(nativeQuery, whereObj); 
    List<FileObjectEntity> resultList = nativeQuery.getResultList(); 

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