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 :

Comment recupérer le code SQL généré par Hibernate !


Sujet :

Hibernate Java

  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Comment recupérer le code SQL généré par Hibernate !
    Bonjour à Tous !

    je travaille sous Eclipse avec Hibernate3 et PostgreSQL8.2 !
    Dans mon projet eclipse j'emets des requêtes en HQL et j'ai besoin de recupérer le code SQL généré par Hibernate et non le voir afficher dans la console (en mettant la propriéte show_sql d'hibernate à true dans le fichier de configuration ).

    Alors comment récupérer le code SQL généré par Hibernate ? (dans une variable de type STRING par exemple)

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    une petite idée de l'amusement qui t'attends, voici un bout de SessionImpl, qui gère les query hql:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    762   public List find(String query) throws HibernateException {
    763     return list( query, new QueryParameters() );
    764   }
    765 
     
    774   public List list(String query, QueryParameters queryParameters) throws HibernateException {
    775 
    776     if ( log.isTraceEnabled() ) {
    777       log.trace( "find: " + query );
    778       queryParameters.traceParameters(factory);
    779     }
    780 
    781     queryParameters.validateParameters();
    782     QueryTranslator[] q = getQueries(query, false);
    783 
    784     List results = CollectionHelper.EMPTY_LIST;
    785 
    786     dontFlushFromFind++;   //stops flush being called multiple times if this method is recursively called
    787 
    788     //execute the queries and return all result lists as a single list
    789     try {
    790       for ( int i = 0; i < q.length; i++ ) {
    791         List currentResults = q[i].list(this, queryParameters);
    792         currentResults.addAll(results);
    793         results = currentResults;
    794       }
    795     }
    796     finally {
    797       dontFlushFromFind--;
    798     }
    799     return results;
    800   }
     
    819   private QueryTranslator[] getQueries(String query, boolean scalar) throws HibernateException {
    820 
    821     // take the union of the query spaces (ie. the queried tables)
    822     QueryTranslator[] q = factory.getQuery( query, scalar, getEnabledFilters() );
    823     return prepareQueries(q);
    824 
    825   }
    Les QueryTranslator semblent contenir ce dont tu as besoin, reste à savoir comment les récupérer

  3. #3
    Membre actif Avatar de mOuLi
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2008
    Messages
    170
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2008
    Messages : 170
    Points : 257
    Points
    257
    Par défaut
    Tu peux éventuellement regarder du côté des ConnectionProvider. Cela te donne accès à la connexion JDBC (interface java.sql.Connection) et donc aux appels SQL.

  4. #4
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    je n'y arrive pas ! je debute en JAVA !!!

    Déjà je ne comprends pas grand chose au code de tchize !

    Si vous pouviez m'indiquer les étapes à suivre...

    Merci

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En gros, c'est pas prévu par hibernate, donc les méthodes que tu pourrais avoir sont généralement assez avancées, donc pas pour débuter. Ce que tu veux faire, récupérer le sql de hibernate, c'est utiliser hibernate comme il a pas été prévu pour. Le code que j'ai indiqué est du code interne à hibernate, là ou il génère ses requetes sql avant de les exécuter. tu notera que ces méthodes sont "private", donc non accessible, donc difficile d'y avoir accès.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par nebisse Voir le message
    Bonjour à Tous !

    je travaille sous Eclipse avec Hibernate3 et PostgreSQL8.2 !
    Dans mon projet eclipse j'emets des requêtes en HQL et j'ai besoin de recupérer le code SQL généré par Hibernate et non le voir afficher dans la console (en mettant la propriéte show_sql d'hibernate à true dans le fichier de configuration ).

    Alors comment récupérer le code SQL généré par Hibernate ? (dans une variable de type STRING par exemple)

    Merci d'avance !

    lorsque show_sql est true Hibernate utilise org.apache.commons.logging avec
    LogFactory.getLog("org.hibernate.SQL");

    il doit être possible de configurer org.apache.commons.logging pour rediriger les logs vers votre propre logger (une classe de votre projet)…

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    JeitEmgie: bien vu! Et c'est presque vrai

    en fait, show_sql est une "alternative" à l'utilisation du logger org.hibernate.SQL, et show_sql utilise toujours la console:

    hibernate.show_sql Write all SQL statements to console. This is an alternative to setting the log category org.hibernate.SQL to debug.
    Donc effectivement, utiliser un logger perso peu aider, mais attention au multithreading

  8. #8
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    peut être tchize trouve t il que j'ai pas le niveau; et c'est vrai qu'en tant que débutant c'est difficile !
    Mais il me le faut ce SQL natif généré par Hibernate. Et je fais m'y mettre !

    Merci !

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    je savais pas qu'il y avait un logger pour çà, çà va etre plus facile

    Commence par regarder un peu la doc de commons logging, çà décrit comment fonctionnent les loggers, comment les configurer, etc. Ensuite, tu devrais faire un logger perso, qui enregistre ce qu'on lui envoie, et relier ce logger avec la config sur org.hibernate.SQL, avec un log level à DEBUG.

  10. #10
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut ca y est je l'ai !!! mon code SQL
    J'ai résussi à récuperer ce fameux code SQL dans un fichier texte !!!!
    J'ai user du framework log4j en passant par son fichier de configuration log4j.properties dans lequel j'ai defini 2 Appenders (destinations logigues des messages) l'un sortie Console et l'autre mon fichier texte. Ensuite j'ai affecter ces appenders à deux loggers respectivement rootLogger et org.hibernate.org (celui qui m'interesse !!!!!!!) .

    Merci à JeitEmgie et tchize pour votre aide.

    @ +

  11. #11
    Membre averti Avatar de ZeRevo
    Inscrit en
    Avril 2007
    Messages
    302
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2007
    Messages : 302
    Points : 342
    Points
    342
    Par défaut
    Oui mais le problème c'est que ca ne te met pas les données (elles sont remplacées par des ?) ...

  12. #12
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut mes données sont bien présentes dans les deux requêtes HQL et SQL !!!
    je ne comprends ce que tu entends par "données" en "?" !!

    Mon probleme était d'avoir la version SQL de ma requête HQL.
    Alors si ce sont les données qui sont dans la requête HQL au départ dont tu parles !! Eh bien je les ai bien dans ma requête SQL du log.
    je te prends un exemple:

    requête HQL: from Property_Det where RID=126;

    requête SQL:
    DEBUG - select property_d0_.RID as RID, property_d0_.EXIST_EN as EXIST3_102_, property_d0_.EXIST_FR as EXIST4_102_, property_d0_.NOTE_EN as NOTE5_102_, property_d0_.NOTE_FR as NOTE6_102_, property_d0_.REMARK_EN as REMARK7_102_, property_d0_.REMARK_FR as REMARK8_102_, property_d0_.SOURCE_DOC_OF_DEFINITION as SOURCE9_102_, property_d0_.DEFINITION_EN as DEFINITION10_102_, property_d0_.DEFINITION_FR as DEFINITION11_102_, property_d0_.ICON as ICON102_, property_d0_.SYNONYMOUS_NAMES_EN_1 as SYNONYMOUS13_102_, property_d0_.SYNONYMOUS_NAMES_EN_2 as SYNONYMOUS14_102_, property_d0_.SYNONYMOUS_NAMES_FR_1 as SYNONYMOUS15_102_, property_d0_.SYNONYMOUS_NAMES_FR_2 as SYNONYMOUS16_102_, property_d0_.PREFERRED_NAME_EN as PREFERRED17_102_, property_d0_.PREFERRED_NAME_FR as PREFERRED18_102_, property_d0_.SHORT_NAME_EN as SHORT19_102_, property_d0_.SHORT_NAME_FR as SHORT20_102_, property_d0_.REVISION as REVISION102_, property_d0_.DATE_OF_ORIGINAL_DEFINITION as DATE22_102_, property_d0_.DATE_OF_CURRENT_REVISION as DATE23_102_, property_d0_.DATE_OF_CURRENT_VERSION as DATE24_102_, property_d0_.FORMULA as FORMULA102_, property_d0_.DOMAIN as DOMAIN102_, property_d0_.DET_CLASSIFICATION as DET27_102_, property_d0_.FIGURE as FIGURE102_, property_d0_.PREFERRED_SYMBOL as PREFERRED29_102_, property_d0_.NAME_SCOPE as NAME30_102_, property_d0_.VERSION as VERSION102_, property_d0_.CODE as CODE102_, property_d0_.LABEL_CODE as LABEL33_102_, property_d0_.LABEL_SIZE as LABEL34_102_, property_d0_.LABEL_K as LABEL35_102_, property_d0_.IS_SYMMETRIC as IS36_102_, property_d0_.IS_TRANSITIVE as IS37_102_, property_d0_.INVERSE as INVERSE102_, property_d0_.RTYPE as RTYPE from PROPERTY_DET_E property_d0_ where property_d0_.RID=126


    je retrouve bien ma donnée: 126 dans les deux requêtes !!!

    Merci du partage et,
    @ +

  13. #13
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    si tu passer par des requetes hsql parametrisée ou si tu prend les update (session.update(monbean)), çà met des ? dans la requete puisque hibernate utilise au maximum les requetes paramétrisée, mais bon, le principal c'est que t'as ce que tu veux, le sql.

    Un petit tag résolu si tout va bien pour toi?

  14. #14
    Futur Membre du Club
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    13
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 13
    Points : 6
    Points
    6
    Par défaut pour un debut ca ira !!!
    Pour un debut en HQL, je ne ferais pas de rêquêtes paramétrées. Mais si quelqu'un trouve comment s'y prendre, faites moi signe !!!!!!!!

    Cependant je dois m'atteler à traduire un langage de requêtes X donné en HQL. Et je ne sais pas encore comment m'y prendre ! si vous avez une idée faites un tour ici :http://www.developpez.net/forums/d60...ethode-suivre/


    @ + et

    Merci encore !

  15. #15
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    pour le ? c'est juste les données qui y sont sous cette forme. comme du coté hql en fait

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 17/10/2013, 03h27
  2. [MySQL] Récupérer Code HTML généré par PHP
    Par @ngelofdeath dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 26/04/2006, 21h51
  3. Réponses: 12
    Dernier message: 20/04/2006, 15h15
  4. Réponses: 3
    Dernier message: 27/01/2006, 15h48
  5. Réponses: 7
    Dernier message: 12/09/2005, 11h05

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