problème hibernate - linux - encoding

problème hibernate - linux - encoding - Java - Programmation

Marsh Posté le 29-07-2005 à 11:53:36    

Bonjour,
 
J'ai une petite appli web qui utilise hibernate comme couche de persistance. L'appli, en gros, c'est deux pages: une page pour faire une recherche et une page de résultats.
 
J'ai un problème avec les requêtes dont la clause where contient des caractères accentués. Par exemple, si je trace la requête hibernate suivante:
 

Code :
  1. from MaClasse where monChamp like '%tamère%'


 
... hibernate va me générer la requête SQL suivante:
 

Code :
  1. select ...blabla SQL...  where monChamp like '%tamÃ"re%'


 
... et du coup la requête va moins bien marcher!  :sweat:  
 
Clairement c'est un problème d'encoding qui d'ailleurs ne survient pas sous windows. Le problème vient de ma config sous linux mais quel élément?
 

  • navigateur? => je pense pas puisque j'écris 'tamère' dans l'input et je trace bien 'tamère' dans la requête hibernate
  • encoding du système?
  • mauvaises directives jsp pour spécifier l'encoding?


Pour infos:
 

  • j'utilise firefox
  • la variable d'environnement LANG est à fr_FR.UTF-8
  • toutes les références à encoding dans mon appli sont à UTF-8


 
Voilà, si vous avez une idée... Par ailleurs si vous avez une doc magique qui explique ces problématiques d'encoding, en particulier sur une plateforme linux, ben ça serait sympa de filer les références  :ange:  
 

Reply

Marsh Posté le 29-07-2005 à 11:53:36   

Reply

Marsh Posté le 30-07-2005 à 00:36:27    

jsp et encoding au niveau de ta db

Reply

Marsh Posté le 03-08-2005 à 12:11:08    

merci pour ta réponse.
 
l'encoding de la db n'est pas en cause car le bug survient  au niveau de la construction de la requête SQL.
 
Concernant la jsp, tout est en utf-8 et, à l'aide du filtre SetCharacterEncodingFilter fourni dans les examples de struts, j'encode toute chaine de ma requête HTTP en UTF-8.
 
Mais hibernate créé quand même une requête avec ces caractères bidons.  
 
Je vais regarder le code d'hibernate, je trouverais bien l'endroit où la chaîne contenant des caractères accentués est touchée.
 
debugging mode power...
 
 

Reply

Marsh Posté le 03-08-2005 à 13:25:28    

mazargman a écrit :


l'encoding de la db n'est pas en cause car le bug survient  au niveau de la construction de la requête SQL.
Mais hibernate créé quand même une requête avec ces caractères bidons.  


tu vérifies ça comment ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-08-2005 à 14:29:24    

dans le fichier de conf d'hibernate, on peut demander le dump des requêtes SQL avec la propriété show_sql.
 
Si tu me poses cette question, c'est peut-êtr que tu veux m'orienter vers un problème d'encoding avec la console. En fait je trace aussi ma requête HQL et les caractères accentués apparaissent bien. Juste après il y a le 'createQuery' qui amène à la trace de la requête SQL avec les caractères bidons.
 
C'est ce qui me fait dire que c'est à partir du moment où hibernate prend la main que ça merdoie... mais ça ne veut pas dire que c'est hibernate qui merdoie non plus :/ D'ailleurs sous windows ça marche.
 

Reply

Marsh Posté le 03-08-2005 à 14:55:39    

mazargman a écrit :

dans le fichier de conf d'hibernate, on peut demander le dump des requêtes SQL avec la propriété show_sql.
 
Si tu me poses cette question, c'est peut-êtr que tu veux m'orienter vers un problème d'encoding avec la console. En fait je trace aussi ma requête HQL et les caractères accentués apparaissent bien. Juste après il y a le 'createQuery' qui amène à la trace de la requête SQL avec les caractères bidons.
 
C'est ce qui me fait dire que c'est à partir du moment où hibernate prend la main que ça merdoie... mais ça ne veut pas dire que c'est hibernate qui merdoie non plus :/ D'ailleurs sous windows ça marche.


clairement, la console et les caractères accentués, j'ai jamais vu ça bien marcher; y'a ptet un truc, mais je le connais pas. Avec un debugger ça donne quoi ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 03-08-2005 à 15:45:10    

En fait je trace dans un fichier donc le problème de la console est écarté.
 
 

Reply

Marsh Posté le 03-08-2005 à 20:18:29    

mouaif, remplacer une source de bugs par une autre hein ... >> debugger.


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 04-08-2005 à 00:25:06    

c'te galère... Si j'ai bien compris Hibernate utilise un framework (antlr) pour transformer les requêtes HQL en requêtes SQL. C'est dans ce bouzin que la clause where est manipulée... bon ben j'y retourne.

Reply

Marsh Posté le 04-08-2005 à 00:28:12    

quelle version d'hibernate, au fait ?

Reply

Marsh Posté le 04-08-2005 à 00:28:12   

Reply

Marsh Posté le 04-08-2005 à 00:29:05    

antlr, c'est pour *parser* tes requetes.

Reply

Marsh Posté le 04-08-2005 à 08:28:35    

hibernate 3.0.5.  
 
C'est effectivement au niveau du parsing qu'hibernate (avec le support de antlr) créé une structure à partir de la requête HQL. Une fois que la requête se trouve saucissonnée dans cette structure, le mal est fait. Suite au prochain numéro.

Reply

Marsh Posté le 04-08-2005 à 12:30:45    

mais j'comprend pas, tes chaines accentuées, c'est des parametres de tes requetes, pas des noms de champ, quand même? donc qu'est-ce que ça va faire dans ton hql ?


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 04-08-2005 à 12:43:07    

oui c'est un critère de recherche dans la clause where (cf. mon premier post pour un exemple).
 
hm, je crois comprendre ce que tu veux dire...
 
Au lieu d'écrire la requête HQL suivante:
 

Code :
  1. from MaTable where monChamp like '%tamère%'


 
je devrais écrire un truc du style:
 

Code :
  1. from MaTable where monChamp like ?


 
et entre mon 'createQuery' et mon 'list', j'appelle un setParameter.
 
Ca me parait être une très bonne idée et plus dans l'esprit de l'API (important l'esprit de l'API...). Pourquoi pas faire du SQL direct tant qu'on y est   :sarcastic:  
 
J'essaye.


Message édité par mazargman le 04-08-2005 à 14:35:32
Reply

Marsh Posté le 04-08-2005 à 13:41:46    

voilà
(sorry j'avais lu ton 1er post entre les lignes)


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Marsh Posté le 04-08-2005 à 14:33:49    

hou pinaise, ça marche.
A l'opposé de M. Jourdain, je ne faisais pas vraiment du HQL dans ma clause where...
 
Ca va m'obliger a revoir toute la construction de ma clause where, mais tant pis: j'ai failli passer à côté d'un truc énorme.
you changed my life.  ;)

Reply

Marsh Posté le 04-08-2005 à 22:10:07    

hehe [:joce]


---------------
Hey toi, tu veux acheter des minifigurines Lego, non ?
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed