2016-07-21 7 views
0

Nous utilisons PostgreSQL 9.4, et Hibernate 5.1 qui semble être un peu les dernières versions. Je sais que Postgres 9.5 est sorti, mais 9.4 ne semble pas si vieux. Nous utilisons JPA avec Hibernate 5.1 et créons des requêtes HQL.Comment fonctionne bitwise_and fonctionner dans Postgres 9.4 et Hibernate 5

Nous avons un champ dans la base de données qui est un bigint. C'est un masque de bits pour nous, stocké en entier. Dans le code Java, cela fonctionne très bien, mais quand on veut vérifier les masques de bit, ça ne marche pas.

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. 

Je regarde I sql mise en veille prolongée généré et peut voir que nous avons quelque chose comme:

bitwise_and(mytable_.actionbitmask, 2)>0 

Alors, je voudrais obtenir le SQL brut à travailler d'abord, puis Je peux ajuster ma requête HQL pour que cela fonctionne aussi.

Maintenant, j'ai cherché Google, et tous les résultats sont de retour avec: - ne peut pas être fait dans HQL, doivent utiliser sql régulièrement Mais la plupart d'entre eux sont très anciens commentaires, et depuis Postgres est 9.4, Hibernate est 5.1, je pense que maintenant nous pouvons comprendre cela avec quelques exemples.

Malheureusement, même les opérations sur les bits 9.4 de Postgres ne s'affichent même pas au niveau du bit et, du tout, la documentation ne fait que suçoter.

Devrais-je convertir mes décimales/longs en binaires de même longueur dans la chaîne sql avant d'exécuter le HQL?

Toute aide serait grandement appréciée. Merci!

+0

Où [dans le manuel] (https://www.postgresql.org/docs/9.4/static/index.html) avez-vous trouvé 'bitwise_and'? Aussi: [edit] votre question et ajoutez l'instruction SQL ** complete **. Mais en général, la nature d'une couche d'obfuscation est que vous ne pouvez pas utiliser de substance spécifique au SGBD. Ils s'installent sur le plus petit dénominateur commun pour les fonctionnalités SQL. –

Répondre

0

D'après ce que j'ai vu sur Internet et diverses recherches de Google, il est un peut-être prendre la classe standard « PostgreSQLDialect » et nous avons prolongé notre propre classe:

public class MyPostgreSQLDialect extends PostgreSQLDialect 

Nous code, puis ajouté dans ici qui a créé une fonction spéciale «bitwise_and».

J'ai dû changer le dialecte de la base de données dans mon fichier de contexte d'application Spring, et réexécuter ma requête HQL. Je ne savais tout simplement pas que c'était le cas, car jusqu'à présent, nous n'effectuions pas de contrôles de bits du tout. Je ne savais pas que nous avions cette extension Dialect jusqu'à tout récemment.

Mais cela a résolu notre problème. Merci!