2016-07-21 17 views
0

Wir verwenden PostgreSQl 9.4 und Hibernate 5.1, die die neuesten Versionen zu sein scheinen. Ich weiß, dass Postgres 9.5 draußen ist, aber 9.4 scheint nicht so alt zu sein. Wir verwenden JPA mit Hibernate 5.1 und erstellen HQL-Abfragen.Wie funktioniert bitwise_and in Postgres 9.4 und Hibernate 5

Wir haben ein Feld in der Datenbank, das ein bigint ist. Dies ist eine Bitmaske für uns, gespeichert als Integer. Im Java-Code funktioniert das großartig, aber wenn wir nach Bitmasken suchen wollen, funktioniert es nicht.

ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper - 
ERROR: function bitwise_and(bigint, integer) does not exist 
Hint: No function matches the given name and argument types. 
You might need to add explicit type casts. 

Ich bin auf der generierten Hibernate SQL suchen und ich kann sehen, dass wir so etwas wie:

bitwise_and(mytable_.actionbitmask, 2)>0 

So, würde Ich mag die rohe SQL bekommen zuerst zu arbeiten, und dann Ich kann meine HQL-Abfrage optimieren, damit das auch funktioniert.

Jetzt habe ich gesucht Google und alle Ergebnisse wieder mit: - nicht in HQL getan werden kann, haben regulären sql verwenden, aber die meisten von ihnen sind sehr alt Kommentare und seit Postgres ist 9,4, Hibernate ist 5.1, ich denke jetzt sicherlich können wir das mit einigen Beispielen herausfinden.

Leider zeigen selbst die Postgres-9,4-Bit-Operationen nicht einmal bitwise_and überhaupt, die Dokumentation saugt nur dort.

Sollte ich meine Dezimalstellen/Longs in Binärdateien der gleichen Länge in der SQL-Zeichenfolge konvertieren, bevor ich die HQL ausführen?

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

+0

Wo finden Sie im Handbuch (https://www.postgresql.org/docs/9.4/static/index.html) 'bitwise_and'? Außerdem: bearbeite deine Frage und füge die ** complete ** SQL-Anweisung hinzu. Im Allgemeinen besteht die Natur einer Verschleierungsebene darin, dass Sie keine DBMS-spezifischen Dinge verwenden können. Sie setzen sich auf den kleinsten gemeinsamen Nenner für SQL-Funktionen. –

Antwort

0

Nach dem, was ich sah im Internet und verschiedene Google-Suche gibt es eine may der Standardklasse ‚PostgreSQLDialect‘ zu nehmen und wir erweitert es um unsere eigene Klasse:

public class MyPostgreSQLDialect extends PostgreSQLDialect 

Wir fügten Code dann in Hier wurde eine spezielle "bitwise_and" -Funktion erstellt.

Ich musste den Datenbankdialekt in meiner Spring-Anwendungskontextdatei ändern und führte meine HQL-Abfrage erneut aus.

Ich wusste einfach nicht, dass das der Fall war, denn bis vor kurzem haben wir keine bitweisen Prüfungen durchgeführt. Ich wusste nicht, dass wir diese Dialektverlängerung bis vor kurzem hatten.

Aber das löste unser Problem. Vielen Dank!