Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2700 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Hibernate Commande SQL direct

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Hibernate Commande SQL direct

n°1266536
Cigue
Posté le 14-12-2005 à 16:48:17  profilanswer
 

Bonjour,
 
 Je souhaiterais executer une commande SQL en passant par hibernate. La commande est du type "ALTER TABLE TEST AUTO_INCREMENT = 0;" (elle permet de remette le curseur de le table TEST à 0 pour rejouer les tests.
 
merci pour vos réponses.
 
a+

mood
Publicité
Posté le 14-12-2005 à 16:48:17  profilanswer
 

n°1266695
souk
Tourist
Posté le 14-12-2005 à 19:34:08  profilanswer
 

si c'est hiberante3 que tu utilises, avec ta session tu utilises createSQLQuery("ma requete sql" ) et apres tu appelles la methode executeUpdate() sur l'objet Query que tu venais de creer. [:petrus75]

n°1267908
Cigue
Posté le 15-12-2005 à 19:42:41  profilanswer
 

souk a écrit :

si c'est hiberante3 que tu utilises, avec ta session tu utilises createSQLQuery("ma requete sql" ) et apres tu appelles la methode executeUpdate() sur l'objet Query que tu venais de creer. [:petrus75]


 
Bonjour,
 
 J'utilise bien Hibernate 3, mais ma rêquete n'est pas du compliante HQL, c'est juste pour pouvoir passer mes tests plusieurs fois  :jap:  
 
 Lorsque je teste le code que tu m'as donné, j'me prend une QuerySyntaxException avec en inner une NoViableAltException sur ALTER  :pt1cable:  
 
merci de perdre du temps  :)  
 

Message cité 3 fois
Message édité par Cigue le 15-12-2005 à 19:48:09
n°1267909
souk
Tourist
Posté le 15-12-2005 à 19:44:47  profilanswer
 
n°1267912
Cigue
Posté le 15-12-2005 à 19:49:38  profilanswer
 


 
 j'polliotise des doigts à c'heur :sol:

n°1267916
souk
Tourist
Posté le 15-12-2005 à 19:54:34  profilanswer
 

Cigue a écrit :

Bonjour,
 
 J'utilise bien Hibernate 3, mais ma rêquete n'est pas du compliante HQL, c'est juste pour pouvoir passer mes tests plusieurs fois  :jap:  
 
 Lorsque je teste le code que tu m'as donné, j'me prend une QuerySyntaxException avec en inner une NoViableAltException sur ALTER  :pt1cable:  
 
merci de perdre du temps  :)


 
deja, si tu nous donnes pas la requete que tu fais, et comment, on va pas pouvoir t'aider [:petrus75]

n°1267917
Cigue
Posté le 15-12-2005 à 19:56:20  profilanswer
 

souk a écrit :

deja, si tu nous donnes pas la requete que tu fais, et comment, on va pas pouvoir t'aider [:petrus75]


 
 ben, la commande c'est :
 
ALTER TABLE TEST AUTO_INCREMENT = 0
 
mais ....

n°1267927
souk
Tourist
Posté le 15-12-2005 à 20:13:21  profilanswer
 

et tu veux toujours pas poster le bout de code secret qui genere l'exception, avec eventuellement la stacktrace (tu l'as donnee en partie mais on sait jamais [:joce] ) ? [:dawa]

n°1267949
phnatomass
Je m'empare de ton esprit !!
Posté le 15-12-2005 à 21:03:26  profilanswer
 

Cigue a écrit :

Bonjour,
J'utilise bien Hibernate 3, mais ma rêquete n'est pas du compliante HQL, c'est juste pour pouvoir passer mes tests plusieurs fois  :jap:  


Récupère la Connection associé à ta Session hibernate et après fais du JDBC.

n°1268119
Cigue
Posté le 16-12-2005 à 08:52:27  profilanswer
 

souk a écrit :

et tu veux toujours pas poster le bout de code secret qui genere l'exception, avec eventuellement la stacktrace (tu l'as donnee en partie mais on sait jamais [:joce] ) ? [:dawa]


 
Salut,
 
 le code secret :)
  String queryString = "ALTER TABLE TEST AUTO_INCREMENT = 0 ";
  try {
   Transaction transaction = this.getSession().beginTransaction();
 
 
   Query q = this.getS().createQuery(queryString);
   q.executeUpdate();
     
   transaction.commit();
  }catch (Exception e) {
   System.out.println("------------------ AUTO_INCREMENT ------------\n" + e);
   e.printStackTrace();
  }
 
 
l'Exception:
------------------ AUTO_INCREMENT ------------
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ALTER near line 1, column 1 [ALTER TABLE TEST AUTO_INCREMENT = 0 ]
org.hibernate.hql.ast.QuerySyntaxException: unexpected token: ALTER near line 1, column 1 [ALTER TABLE TEST AUTO_INCREMENT = 0 ]
 at org.hibernate.hql.ast.ErrorCounter.throwQueryException(ErrorCounter.java:59)
 at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:242)
 at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:153)
 at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:103)
 at org.hibernate.impl.SessionFactoryImpl.getQuery(SessionFactoryImpl.java:473)
 at org.hibernate.impl.SessionImpl.getQueries(SessionImpl.java:1060)
 at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1041)
 at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:89)
 at net.paycool.test.fw.FacadeTest.InitIncrement(FacadeTest.java:75)
 at net.paycool.test.fw.RWWithThread.tearDown(RWWithThread.java:56)
 at net.paycool.test.fw.RWWithThread.main(RWWithThread.java:22)
Caused by: line 1:1: unexpected token: ALTER
 at org.hibernate.hql.antlr.HqlBaseParser.statement(HqlBaseParser.java:171)
 at org.hibernate.hql.ast.QueryTranslatorImpl.parse(QueryTranslatorImpl.java:236)
 ... 9 more
 
 

mood
Publicité
Posté le 16-12-2005 à 08:52:27  profilanswer
 

n°1268122
Cigue
Posté le 16-12-2005 à 09:05:08  profilanswer
 

phnatomass a écrit :

Récupère la Connection associé à ta Session hibernate et après fais du JDBC.


 
 Merci, je ne savais pas que l'on pouvais récupérer la connexion JDBC.  :bounce:  
 Merci beaucoup, problème résolue :)
 
PS: J'suis nouveau sur les forum, doit on indiquer que ma question est résolue  :??:

n°1268157
souk
Tourist
Posté le 16-12-2005 à 10:05:18  profilanswer
 

Cigue a écrit :

Salut,
 
 le code secret :)
  String queryString = "ALTER TABLE TEST AUTO_INCREMENT = 0 ";
  try {
   Transaction transaction = this.getSession().beginTransaction();
 
 
   Query q = this.getS().createQuery(queryString);
   q.executeUpdate();
     
   transaction.commit();
  }catch (Exception e) {
   System.out.println("------------------ AUTO_INCREMENT ------------\n" + e);
   e.printStackTrace();
  }


 
heureusement qu'on t'as dit de faire un createSQLQuery... evidement, createQuery prend en parametre une requete HQL [:kiki]

n°1268179
Cigue
Posté le 16-12-2005 à 10:20:52  profilanswer
 

souk a écrit :

heureusement qu'on t'as dit de faire un createSQLQuery... evidement, createQuery prend en parametre une requete HQL [:kiki]


 
 o bien vue, désolé, mille excuses.  :)  
 (Avec la connexion JDBC, ça fonctionne mais je préfére cette solution)
 
 J'ai modifié mon code:
 
  String queryString = "ALTER TABLE TEST AUTO_INCREMENT = 0 ";
  try {
   Transaction t = this.getS().beginTransaction();
 
   Query q = this.getS().createSQLQuery(queryString);
   q.executeUpdate();
   /*Connection c = this.getS().connection();
   PreparedStatement pstmt = c.prepareStatement(queryString);
   pstmt.execute();*/
   
   t.commit();
  }catch (Exception e) {
   System.out.println("------------------ AUTO_INCREMENT ------------\n" + e);
   e.printStackTrace();
  }
 
et je prends :
------------------ AUTO_INCREMENT ------------
java.lang.UnsupportedOperationException: Update queries only supported through HQL
java.lang.UnsupportedOperationException: Update queries only supported through HQL
 at org.hibernate.impl.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:654)
 at net.paycool.test.fw.FacadeTest.InitIncrement(FacadeTest.java:80)
 at net.paycool.test.fw.FacadeTest.deleteAll(FacadeTest.java:69)
 at net.paycool.test.fw.RWWithThread.tearDown(RWWithThread.java:59)
 at net.paycool.test.fw.RWWithThread.main(RWWithThread.java:22)

n°1268354
Chronoklaz​m
Posté le 16-12-2005 à 13:12:16  profilanswer
 

Deja faut pas zapper les rollback ...
 

Code :
  1. public void update() throw Exception {
  2.         String queryString = "ALTER TABLE TEST AUTO_INCREMENT = 0 ";
  3.         Session session = this.getS();
  4.         Transaction tx = null;
  5.         try {
  6.             tx = session.beginTransaction();
  7.             // Ordre Hibernate             
  8.             Query q = session.createSQLQuery(queryString);
  9.             q.executeUpdate();
  10.             tx.commit();
  11.         } catch (HibernateException ex) {
  12.             if (tx != null) tx.rollback();
  13.             throw new Exception(ex);
  14.         } finally {
  15.             try {
  16.                 this.getS().closeSession(); /// chez pas coment ca se fait chez toi ...
  17.             } catch (HibernateException ex) {
  18.                 throw new Exception("Problème pendant fermeture de la session", ex);
  19.             }
  20.         }
  21.     }


 
Et si tu laissé gerer l'auto incrementation par Hibernate sans toucher la table direct, cad si tu utilise un genrator  du style :

Code :
  1. <id name="id" type="long" column="PAYMENT_ID">
  2.         <generator class="native"/>
  3.     </id>


 
Peut etre que tu pourrait la modifier dans tes ordres hql ... (plus portable et plus sur)

Message cité 1 fois
Message édité par Chronoklazm le 16-12-2005 à 13:13:20

---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1268363
Chronoklaz​m
Posté le 16-12-2005 à 13:22:20  profilanswer
 

Sinon au pire tu peux faire ta propre sequence et la controler toi meme si ca te chante ...  
 
Regarde ici :
http://www.jroller.com/page/jigi/20050907


---------------
Scheme is a programmable programming language ! I heard it through the grapevine !
n°1268370
Cigue
Posté le 16-12-2005 à 13:36:48  profilanswer
 

Chronoklazm a écrit :

Deja faut pas zapper les rollback ...
 
 Dans l'appli, les rollback sont gérés comme tu le fais. C'est un exemple, pour trouver une solution, sorti du code.
 
 Je laisse Hibernate gérer l'increment:
    <class name="ObjectTest" table="TEST"
     optimistic-lock="all" dynamic-update="true">
 
        <id name="Id" column="ID" type="long" unsaved-value="0" >
            <generator class="identity"/>
        </id>
        <property name="Value" optimistic-lock="true"/>
    </class>
 
 J'ai besoin de remetter le compteur à zéro pour mes tests. J'ai plusieurs thread qui incrementent, chaque thread fait +1, l'attribu Value, que tu vois dans ObjectTest, et à la fin du jeu de test, je regarde si ma valeur est égale au nombre de thread. Même si il y a des echecs, du à la concurence sur ces thread, l'appli ré-essai jusqu'a réusite :) Ca marche bien.  
 Mais lorsque je relance mon test, l'object créer n'est plus le numéro un, mais le deux!! donc ma vérif échoue :cry:  
 Je pourrais retrouver le bon, mais c'est compliqué, alors qu'avec cette ALTER, je sais que c'est toujours le numéro 1 que je test (facile).
 
voili voilou :)
 

Code :
  1. public void update() throw Exception {
  2.         String queryString = "ALTER TABLE TEST AUTO_INCREMENT = 0 ";
  3.         Session session = this.getS();
  4.         Transaction tx = null;
  5.         try {
  6.             tx = session.beginTransaction();
  7.             // Ordre Hibernate             
  8.             Query q = session.createSQLQuery(queryString);
  9.             q.executeUpdate();
  10.             tx.commit();
  11.         } catch (HibernateException ex) {
  12.             if (tx != null) tx.rollback();
  13.             throw new Exception(ex);
  14.         } finally {
  15.             try {
  16.                 this.getS().closeSession(); /// chez pas coment ca se fait chez toi ...
  17.             } catch (HibernateException ex) {
  18.                 throw new Exception("Problème pendant fermeture de la session", ex);
  19.             }
  20.         }
  21.     }


 
Et si tu laissé gerer l'auto incrementation par Hibernate sans toucher la table direct, cad si tu utilise un genrator  du style :

Code :
  1. <id name="id" type="long" column="PAYMENT_ID">
  2.         <generator class="native"/>
  3.     </id>


 
Peut etre que tu pourrait la modifier dans tes ordres hql ... (plus portable et plus sur)



Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Hibernate Commande SQL direct

 

Sujets relatifs
[Heeelp] PHP en ligne de commandeSQl\excel
Import Export de données dans une BDD SQL et fichier texteSQL Server 2005 Express et Full-text index ?
[SQL Server]Reporting Services : Pages blanches à l'export des reports[SGBD/SQL] structure de tables [RESOLU]
[SQL] Multiplication de colonneTransferer ma base de donnée SQL sur un autre serveur.
Problème avec Matlab : commande xlsread et xlswritePartager une seule base SQL pour deux sites ? Est-ce contre indiqué ?
Plus de sujets relatifs à : Hibernate Commande SQL direct


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR