ERREUR: opérateur n'existe pas: entier = character varying, à l'aide de Postgresql 8.2
J'ai une application web Java EE développé dans une ancienne version d'Eclipse (Ganymède si je me souviens bien). J'ai récemment migré vers Kubuntu 12.04 LTS et à la migration de l'application Eclipse Kepler (que j'ai téléchargé et installé à partir du site web d'Eclipse). C'est à l'aide de Java Niveau de Conformité 1.6 et le conteneur cible est Tomcat 6.
Mon problème est que je reçois l'erreur:
org.postgresql.util.PSQLException: ERREUR: opérateur n'existe pas: entier = character varying
lorsque l'application rencontre une page avec un certain Postgres requête. Je suis à l'aide de la JSTL sql:query et sql:param balises pour mettre en œuvre une déclaration préparée à l'intérieur de la page jsp. Je sais que c'est considéré comme une mauvaise pratique, mais je ne suis pas l'auteur original et cette technique est utilisée tout au long de l'application.
L'erreur se produit en raison de tenter d'assigner une chaîne en entier dans le sql:balise param. Dans la configuration précédente tout casting qui s'est passé de manière transparente et il n'y a pas d'erreur. Avec la nouvelle installation, je reçois l'erreur.
J'ai lu que plus stricte de la conversion de type est introduite avec Postgres 8.3 qui serait la cause de cette erreur, mais je suis en utilisant le Postgresql 8.2 JDBC 4 fichier jar dans mon application, donc ça devrait marcher. Je suis perplexe. Peut-être quelqu'un a une idée?
Je suis tombé sur une solution de contournement, de multiplier la chaîne par 1 avant de faire la comparaison:
http://dev-answers.blogspot.co.uk/2010/08/type-coercion-in-jstl-for-sqlparam.html
Mais c'est un peu de bidouille et j'aurais beaucoup de pages à modifier. Mais il est universitaire, parce que je ne devrait pas le problème de toute façon.
Merci pour la lecture. Toute aide grandement appréciée.
OriginalL'auteur user2661243 | 2013-08-08
Vous devez vous connecter pour publier un commentaire.
Vous pourriez être en utilisant PostgreSQL 8.2 pilote JDBC, mais on dirait que vous êtes en utilisant une nouvelle PostgreSQL serveur version. Essayez:
Betcha il 8.3 ou plus récent.
Ces requêtes ne sont pas vraiment droit et doit de préférence être fixe. Si vous devez vous pouvez modifier les catalogues système, afin de permettre la distribution de façon implicite, mais ce devrait être une solution de contournement temporaire seulement, jusqu'à ce que vous pouvez résoudre les requêtes de l'application de l'envoi. La solution proposée dans ce billet de blog est horrible, mais c'est la JSTL si elle n'offre pas de type jette dans un très typée langue. Personnellement, je serais plus enclin à force explicite de la coercition à la requête, par exemple, dans l'exemple du blog:
? :: integer
est un de type cast dans PostgreSQL abréviation de la syntaxe. Vous pouvez écrire à la norme SQLCAST(? AS integer)
si vous préférez.Voir:
La leçon ici: Toujours lire les notes de version de grandes mises à jour de version avant de mettre à niveau.
Rubrique
Je me demandais pourquoi il a travaillé avant que. Le serveur de la version de PostgreSQL a été le même. Très étrange.
Je ne pouvais pas expliquer que, à moins peut-être que votre JSTL est arrivé à produire des paramètres qui correspondent aux types attendus par la DB avant. La comparaison d'entiers de texte ne doit pas travailler sans un casting chez 8.3 ou toute version ultérieure du serveur.
OriginalL'auteur Craig Ringer