Hibernate Commande SQL direct

Hibernate Commande SQL direct - Java - Programmation

Marsh Posté le 14-12-2005 à 16:48:17    

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+

Reply

Marsh Posté le 14-12-2005 à 16:48:17   

Reply

Marsh Posté le 14-12-2005 à 19:34:08    

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]

Reply

Marsh Posté le 15-12-2005 à 19:42:41    

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
Reply

Marsh Posté le 15-12-2005 à 19:44:47    

Reply

Marsh Posté le 15-12-2005 à 19:49:38    


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

Reply

Marsh Posté le 15-12-2005 à 19:54:34    

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]

Reply

Marsh Posté le 15-12-2005 à 19:56:20    

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 ....

Reply

Marsh Posté le 15-12-2005 à 20:13:21    

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]

Reply

Marsh Posté le 15-12-2005 à 21:03:26    

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.

Reply

Marsh Posté le 16-12-2005 à 08:52:27    

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
 
 

Reply

Marsh Posté le 16-12-2005 à 08:52:27   

Reply

Marsh Posté le 16-12-2005 à 09:05:08    

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  :??:

Reply

Marsh Posté le 16-12-2005 à 10:05:18    

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]

Reply

Marsh Posté le 16-12-2005 à 10:20:52    

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)

Reply

Marsh Posté le 16-12-2005 à 13:12:16    

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 !
Reply

Marsh Posté le 16-12-2005 à 13:22:20    

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 !
Reply

Marsh Posté le 16-12-2005 à 13:36:48    

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)


Reply

Sujets relatifs:

Leave a Replay

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