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 :

insert de masse avec createSQLQuery


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut insert de masse avec createSQLQuery
    Bonjour,
    J'essaie de faire un insert de masse (insert into .. select"dans une requête hibernate en utilisant le sql natif : voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Transaction transaction = session.beginTransaction();
               String sqlRequete = "insert into T1";
               sqlRequete = sqlRequete + "select T2.code, T2.nom";
               sqlRequete = sqlRequete + " from T2  where T2.TYPE='N'" ;
     
               SQLQuery query = session.createSQLQuery(sqlRequete);
               query.executeUpdate();
    Et voici ce que j'ai comme message erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    javax.servlet.ServletException: java.lang.UnsupportedOperationException: Update queries only supported through HQL
    	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:516)
    	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:423)
    	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:226)
    	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1164)
    	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:415)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
    	javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
    J'ai écrit une requête avec un "update" et c'est la même chose.
    J'ai essayé aussi en vain avec "Query query = session.createSQLQuery(sqlRequete);"

    Je précise que cette application utilise hibernate ; mais que pour des besoins internes et exceptionnellement je dois utiliser cet insert de masse.


    Merci d'avance
    Chris.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    D'après la documentation, tu ne peux pas faire d'inserts avec executeUpdate() MAIS uniquement des updates et des deletes

    public int executeUpdate() throws HibernateException

    Execute the update or delete statement. The semantics are compliant with the ejb3 Query.executeUpdate() method.

    Returns:
    The number of entities updated or deleted.
    Throws:
    HibernateException

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut Ajoute un espace
    Ajoute un espace à la deuxième ligne déjà

    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sqlRequete = "insert into T1";
    sqlRequete = sqlRequete + "select T2.code, T2.nom";
    sqlRequete = sqlRequete + " from T2  where T2.TYPE='N'" ;
    Mais plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String sqlRequete = "insert into T1";
            sqlRequete = sqlRequete + " select T2.code, T2.nom";
            sqlRequete = sqlRequete + " from T2  where T2.TYPE='N'" ;

  4. #4
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Effectivement , c'est une erreur de recopie. Mais bon ça ne change rien.
    C'est bien ce qui me semblait : pas de possibilité d'insert,
    Me reste la solution basique de récupérer mes infos de ma table T1 dans une liste java puis de faire un save hibernate ligne par ligne ; en espérant que ça ne prendra pas trop de temps.
    Sinon je regarde l'utilisation d'un proc stockée dans hibernate

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    passe une bonne journée hibernante

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 64
    Par défaut
    Bonjour

    J'ai été confrontée à ce problème : côté hibernate, tu ne peux rien faire.
    Il faut une connection jdbc mais que tu peux récupérer à partir d'une connection hibernate.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    try {   
    Transaction transaction = session.beginTransaction();
    String sqlRequete = "insert into T1";
            sqlRequete = sqlRequete + " select T2.code, T2.nom";
            sqlRequete = sqlRequete + " from T2  where T2.TYPE='N'" ;
    Statement statement  = session.connection().createStatement();          
               int cpt =statement.executeUpdate(sqlRequete); (cpt = nbre de ligne insérées) transaction.commit();           
            } catch (SQLException e) {
                throw new SQLException(e);
    ..........
    Effectivement si tu as plusieurs requêtes, tu peux utiliser une proc stockée : ci joint un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CallableStatement callSmt = session.connection().prepareCall("{call MY_PROC(?)}");
    callSmt.setString(1, identifiant);
    callSmt.executeUpdate();
    Bonne continuation

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 82
    Par défaut
    session.connection() est deprecated.

    Il faut utiliser session.doWork().

    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
     
    import java.sql.Connection;
    import java.sql.SQLException;
     
    import org.hibernate.jdbc.Work;
     
    public class PersonalWork implements Work {
     
    	public void execute(Connection connection) throws SQLException {
    		//Code SQL classique
    	}
     
    }
     
    et executer : session.doWork( new PersonalWork() );

  8. #8
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 23
    Par défaut
    Merci Sandrine49,
    J'ai testé , ça répond à mes besoins : réponse précise et efficace

    Chris

  9. #9
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Ca pose pas des problèmes de fraîcheur de cache ?

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

Discussions similaires

  1. Insert en masse dans une table avec Hibernate
    Par goomie dans le forum Hibernate
    Réponses: 2
    Dernier message: 08/05/2011, 23h47
  2. Insertion de noNamespaceSchemaLocation avec XSLT
    Par sapjo dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 11/10/2004, 16h48
  3. Insertion de données avec Posgretsql
    Par djibril dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 18/05/2004, 11h23
  4. Réponses: 2
    Dernier message: 14/05/2004, 14h32
  5. insertion des blob avec LOAD DATA...
    Par orli1x51 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 27/10/2003, 18h05

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