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 :

[HIBERNATE] Problème d'insert de masse en HQL


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 16
    Points : 7
    Points
    7
    Par défaut [HIBERNATE] Problème d'insert de masse en HQL
    Bonjour, voilà j'ai un petit soucis avec une requête d'insert de masse en HQL, elle ne passe pas et me génère une exception ( ).


    Le petit bout de code incriminé (SGBD Oracle) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    String sqlRequete = "insert into Function ";
    sqlRequete = sqlRequete + "(version, code, role, application, number, functionCode) ";
    sqlRequete = sqlRequete + "select Function.version, '" + Code +  "', '" + role + "', ";
    sqlRequete = sqlRequete + "Function.application, Function.number, Function.functionCode ";
    sqlRequete = sqlRequete + "from function Function ";
    sqlRequete = sqlRequete + "where f.functionCode = 'LA' ";
     
    query = getPersistenceManager().createQuery(sqlRequete);
    result = query.executeUpdate();
    Les variables code et role sont bien évidemment passées en paramètres et je ne renseigne pas l'id car j'ai une sequence Oracle - j'ai déjà testé le cas où je renseigne "manuellement" l'id.

    Je ne pense pas que cela puisse venir d'un problème de fichiers de configuration car mes requêtes HQL de select marchent très bien, ainsi que les insert, update et delete réalisées via l'hibernate session.

    L'exception générée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    org.hibernate.hql.ast.QuerySyntaxError: unexpected token: insert
     near line 1, column 1 [insert into Function 
    (version, code, role, application, Number, 
    FunctionCode) select function.version, '54', 
    'UPM', Function.application, 
    Function.Number, 
    Function.FunctionCode from 
    Function 
    Function where Function.FunctionCode = 'LA' ]
    J'avoue que j'y perd mon latin^^
    J'ai réellement besoin d'un coup de pouce car cela me semble tellement idiot que j'ai du zapper un élément totalement évident^^

    Merci d'avance!
    A man's dream will never die !

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 54
    Points : 40
    Points
    40
    Par défaut
    Tu utilises quelle version d'Hibernate ? En dessous de la version 3.x il t'est
    impossible de faire des inserts en HQL. Pour ce faire, tu dois récuépere la
    connection jdbc sous-jacente et faire du SQL Natif :

    Connexion cnx = hibernateSession.getSession().getConnection();
    // etc...

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    J'utilise la version 3.0.5, donc cela devrait fonctionner en toute logique^^

    Sinon pour contourner "temporairement" le problème j'ai eu la même idée que tu suggères, à savoir récupérer une connection jdbc sous-jacente et faire du SQL Natif.
    Malheureusement mes contraintes m'obligent (un bien grand mot^^) à faire de "l'hibernate", donc je vais devoir trouver pourquoi ma requête HQL ne passe pas.
    A man's dream will never die !

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Je ne connais pas grand chose à Hibernate mais je pense que tu devrais pouvoir t'en sortir en appliquant la bonne vieille méthode du "je démarre sur un truc qui fonctionne". Commence à partir d'une requète plus simple avant de te lancer dans une requète comme celle là... Pourquoi ne pas essayer avec :
    "select sesamMenuFunction.hversion from SesamMenuFunction sesamMenuFunction"

    PS : En survolant l'exception, j'ai l'impression que tu envoies deux requètes hql à la fois, est-ce permis ? Ne manque t'il pas un séparateur ?

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Points : 239
    Points
    239
    Par défaut
    Salut,

    pour ce genre de requête (maj d'une table à partir de données provenant d'un autre table - ou bien la même), il vaudrait mieux utiliser le SQL natif avec la fonction createSQLQuery(String).

  6. #6
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Youkai > comme je l'ai précisé dans mon premier post mes requêtes HQL de type select marchent très bien, aucun souci à ce niveau là.
    La requête que j'essaie de faire passer est une INSERT INTO...SELECT, le seul type d'insert accepté pour les HQL (les INSERT INTO...VALUES ne sont pas autorisées).

    sleepy2002 > j'ignore si le SQL natif est plus "approprié" mais comme je suis dans un environnement Hibernate je préférerais faire de l'hibernate "Totale" et donc passer par une HQL - surtout que la documentation de hibernate.org confirme que c'est tout à fait possible => c'est censé passer comme une lettre à la poste
    A man's dream will never die !

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Points : 239
    Points
    239
    Par défaut
    Re,

    après une lecture plus attentive je me demandais si les quotes ' n'étaient pas de trop vu que tu utilises HQL. En principe, Hibernate utilise le mapping pour "binder" les propriétés avec les bon types de données. A voir ...

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Yop,

    J'ai testé sans les quotes ' mais malheureusement ça ne change rien, toujours la même exception levée...

    Par contre ta remarque m'a amené à me poser une question, à savoir est-ce qu'avec une requête HQL de type INSERT INTO...SELECT on a le droit de passer en "dur" certaines valeurs (je fais référence à mes paramètres entityCode et roleCode ), et pas uniquement des valeurs issues de tables (comme par exemple sesamMenuFunction.hversion).
    A priori je dirais que oui mais bon, on ne sait jamais^^
    A man's dream will never die !

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2004
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Je me permets un double post.

    Un collègue a décompilé les sources de hibernate v3 et après investigation a découvert que le mot clé "insert" n'y figurait pas...
    Donc aucune chance que la requête passe!
    Personnellement je considère le problème clos même si je trouve très "étrange" que la documentation disponible sur hibernate.org ne soit pas à jour alors que l'outil se veut professionnel...

    En tout cas merci à ceux qui m'ont répondu
    A man's dream will never die !

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 239
    Points : 239
    Points
    239
    Par défaut
    Exact, Hibernate souhaite que l'on passe par la méthode save. Donc si tu veux faire celà, il faudrait peut-être essayer le SQL Natif.

    Hibernate est un très bon framework mais il bouscule les habitudes de ceux qui ont cotoyé le JDBC. Une fois un peu maîtrisé c'est un régal de l'utiliser.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Unitils] [TestNG][DBUnit][JPA][Hibernate] problème de sequence lors d'un insert.
    Par Faiche dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 19/10/2009, 16h39
  2. [JNDI LDAP] Problème d'insertion en masse
    Par voleurdecarottes dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 09/04/2009, 14h17
  3. Problème d'insertion hibernate dans la base
    Par sheura dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/09/2007, 14h02
  4. [HIBERNATE] Problème d'insert
    Par zegreg dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/03/2006, 20h38
  5. [Hibernate] problème d'insertion dans la base de données
    Par Willy7901 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 18/08/2005, 13h19

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