IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Hibernate Java Discussion :

Problème d'encodage avec Hibernate


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut Problème d'encodage avec Hibernate
    Bonjour,

    Je suis actuellement sur une fonctionnalité dont le but est de charger dans une base de données ORACLE un fichier excel lu depuis JAVA.

    Le fichier est lu via l'API POI :

    * Lecture du fichier et des cellules
    * Comparaison d'une cellule lue avec des données en base via Hibernate
    * Si l'on retrouve le libellé lu dans le fichier dans la base on fait une mise à jour en base de données

    Pour simplifier, je passe la variable "doc" à la fonction "findAllByDocIdClient" mais cette fonction ne donne aucune ligne.
    Je pense qu'il y a clairement un problème d'encodage et de ce fait nous avons rajouté la fonction "filterString" mais la fonction "findAllByDocIdClient" ne me renvoie aucune ligne.
    Pourtant, je passe : doc="Ayants*droit*économiques"
    Et en base ce document existe bien !!
    Merci pour votre aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    public List findAllByDocIdClient(String doc, Long idClient){
           List result = null;
              Session session = sessionFactory.getCurrentSession();
              try {
     
                  session.beginTransaction();
                  result = session.createCriteria(Kyc.class)
                   .add(Restrictions.eq("client.CIdClient",idClient))
                   .add(Restrictions.like("LDocument",filterString(doc)))               
                   .list();                                           
     
              } catch (HibernateException he) {
                   log.error("ERROR ----------- findAllByDocIdClient");
                   throw he;
              }finally{
                   session.getTransaction().commit();
                   HibernateUtil.closeSession(session);
                   return result;
              }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private String filterString (String valeur){
             byte[] temp = valeur.getBytes();
             for(int i=0;i<temp.length;i++){
                 if (temp[i] == -96){
                     temp[i] = (byte)' ';
                 }             
             }
             return new String(temp);
         }

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Probablement un soucis de charset sur le é... Mais il peut être n'importe où.

    - Peut-être que la chose qui lit la variable "doc" qui est finalement passée à cette méthode, s'est trompée de charset.
    => Pour vérifier : utiliser un débuggeur. Mettre un breakpoint quelque part où on voit la variable doc. Vérifier qu'elle contient bien un é. Si non, le problème est là.
    - Peut-être que la connexion entre ton appli et la BDD ne configure pas le charset de la même manière que le fait ton navigateur de BDD habituel.
    => Pour vérifier : se servir de ton appli Java pour insérer du texte qui contient é dans ta base de données. Peu importe où, ça peut être dans une nouvelle table bidon. Vérifier que ça marche, et que quand tu la regarde avec ton navigateur de BDD habituel, c'est bien un é. Sinon, le problème est là.
    - Peut-être les deux à la fois.

    Bref, difficile à dire, mais je suggère de regarder ces points-là.

    Aussi, sois gentil de nous remplacer ta méthode filterString :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private static final char NO_BREAK_SPACE = '\u00A0';
    private static final char SPACE = ' ';
     
    private static String filterString (String valeur){
      return valeur.replace(NO_BREAK_SPACE, SPACE);
    }
    On n'utilise jamais String.getBytes() ni new String(byte[] array)... Sauf quand on cherche les ennuis.
    On utilise éventuellement String.getBytes(String charset) et new String(byte[] array, String charset), si vraiment on doit. Ce qui n'est pas le cas ici.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 560
    Par défaut
    Merci pour ces conseils intéressants.

    J'ai essayé une autre méthode consistant à convertir quoiqu'il arrive les données de la base et les données du fichier via cette méthode "filterString" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    docBase = filterString(k.getLDocument()); // Donnée qui vient de la base
    doc = filterString(doc); // Donnée qui vient du fichier
    ...
    if(docBase.compareTo(doc)==0)
    {
         status = true;
         break;
    }
    Pour le moment je n'ai plus de problème, dois je pour autant ne pas utiliser cette méthode ?

    Merci pour ton retour.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Citation Envoyé par david71 Voir le message
    Pour le moment je n'ai plus de problème, dois je pour autant ne pas utiliser cette méthode ?
    Juste utiliser ma version à la place. La mienne fera la même chose (c'est-à-dire ce que tu souhaites) quel que soit le charset par défaut de la plate-forme. La tienne, non.

    Pas de String.getBytes() ni de new String(byte[] array).
    Uniquement des String.getBytes(String charset) et des new String(byte[] array, String charset). (Et encore, si on en a pas besoin, je vois pas pourquoi s'embêter avec ça.)

    C'est simple, comme règle.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/03/2007, 22h33
  2. Problème de connection avec Hibernate Synchronizer
    Par ouzzine dans le forum Hibernate
    Réponses: 8
    Dernier message: 30/11/2006, 13h51
  3. Problème d'encodage avec MyODBC
    Par stack dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2006, 12h11
  4. [Mail] Problème d'encodage avec phpmailer
    Par catmary dans le forum Langage
    Réponses: 8
    Dernier message: 29/06/2006, 10h56
  5. Problème d'encodage avec Python
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 2
    Dernier message: 22/02/2006, 14h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo