Est-il possible dans Hibernate d'imprimer des requêtes SQL générées avec des valeurs réelles au lieu de points d'interrogation?
Comment suggéreriez-vous d'imprimer des requêtes avec des valeurs réelles si cela n'est pas possible avec l'API Hibernate?
Réponses:
Vous devez activer la journalisation pour les catégories suivantes:
org.hibernate.SQL
- défini pourdebug
enregistrer toutes les instructions SQL DML lors de leur exécutionorg.hibernate.type
- réglé pourtrace
enregistrer tous les paramètres JDBCUne configuration log4j pourrait donc ressembler à:
La première est équivalente à la propriété
hibernate.show_sql=true
héritée , la seconde imprime entre autres les paramètres liés.Une autre solution (non basée sur l'hibernation) serait d'utiliser un pilote proxy JDBC comme P6Spy .
la source
org.hibernate.type.descriptor.sql.BasicBinder
enregistreur. Activer la connexion surorg.hibernate.type
imprimé trop d'informations inutiles pour moi ...org.hibernate.type
etorg.hibernate.loader.hql
ne fonctionne pas pour moi pour afficher les paramètresPour plus de commodité, voici le même exemple de configuration pour Logback (SLF4J)
La sortie dans votre sql.log (exemple) ressemble alors à ceci:
la source
Changer
hibernate.cfg.xml
pour:Incluez log4j et les entrées ci-dessous dans "log4j.properties":
la source
binding parameter [1] as [VARCHAR] - [1]
.En cas d'utilisation d'une botte de printemps, configurez simplement ceci:
aplication.yml
aplication.properties
Et rien de plus.
HTH
la source
Log4JDBC est une bonne solution qui imprime le SQL exact allant à la base de données avec des paramètres en place plutôt que la réponse la plus populaire ici qui ne le fait pas. Un avantage majeur de ceci est que vous pouvez copier le SQL directement sur votre frontal DB et l'exécuter tel quel.
http://log4jdbc.sourceforge.net/
https://code.google.com/p/log4jdbc-remix/
Ce dernier produit également une représentation tabulaire des résultats de la requête.
Exemple de sortie montrant le SQL généré avec des paramètres en place avec le tableau de l'ensemble de résultats de la requête:
Mise à jour 2016
Plus récemment, j'utilise maintenant log4jdbc-log4j2 ( https://code.google.com/archive/p/log4jdbc-log4j2/ ) avec SLF4j et logback. Les dépendances Maven requises pour ma configuration sont les suivantes:
Les URL du pilote et de la base de données ressemblent alors à:
Mon fichier de configuration logback.xml ressemble à ce qui suit: cela génère toutes les instructions SQL avec des paramètres ainsi que les tables d'ensemble de résultats pour toutes les requêtes.
Enfin, j'ai dû créer un fichier nommé log4jdbc.log4j2.properties à la racine du chemin de classe, par exemple src / test / resources ou src / main / resources dans un projet Mevn. Ce fichier a une ligne qui est la suivante:
Ce qui précède dépendra de votre bibliothèque de journalisation. Consultez la documentation sur https://code.google.com/archive/p/log4jdbc-log4j2 pour plus d'informations.
Exemple de sortie:
la source
Vous pouvez ajouter des lignes de catégorie à log4j.xml:
et ajouter des propriétés d'hibernation:
la source
ajoutez les propriétés et valeurs suivantes à votre configuration log4j ou logback:
la source
org.hibernate.type.descriptor.sql.BasicBinder
catégorie n'inclut pas tous les paramètres, par exemple les types d'énumération. Donc, si vous voulez tout, vous avez vraiment besoinTRACE
de tout leorg.hibernate.type
groupe.Vous pouvez le faire en utilisant le proxy de source de données , comme je l'ai décrit dans cet article .
En supposant que votre application attend un
dataSource
bean (par exemple via@Resource
), voici comment configurerdatasource-proxy
:Maintenant, la sortie Hibernate vs datasource-proxy:
Les
datasource-proxy
requêtes contiennent des valeurs de paramètres et vous pouvez même ajouter des intercepteurs d'instructions JDBC personnalisés afin de pouvoir détecter les problèmes de requête N + 1 directement à partir de vos tests d'intégration .la source
allumez l'
org.hibernate.type
enregistreur pour voir comment les paramètres réels sont liés aux points d'interrogation.la source
la source
La solution est correcte mais enregistre également toutes les liaisons pour les objets de résultat. Pour éviter cela, il est possible de créer un appender séparé et d'activer le filtrage, par exemple:
la source
la source
Cette réponse est un peu différente pour la question. Parfois, nous n'avons besoin de sql qu'à des fins de débogage lors de l'exécution. Dans ce cas, il existe un moyen plus simple d'utiliser le débogage sur les éditeurs.
C'est pour la mise en veille prolongée 3. Je ne suis pas sûr que cela fonctionne sur d'autres versions.
la source
Le pilote mysql jdbc a déjà fourni un moyen pratique pour répondre à cette exigence, vous devez au moins avoir la version jar> = mysql-connect-jar-5.1.6.jar
étape 1: [configurez votre jdbc.url pour ajouter un enregistreur et une journalisation personnalisée]
maintenant, il utilise la journalisation slf4j, si votre journalisation par défaut est log4j, vous devez ajouter les dépendances slf4j-api, slf4j-log4j12 pour utiliser la journalisation slf4j
étape 2: [rédigez votre journal personnalisé]
la source
J'aime ça pour log4j:
la source
La journalisation fonctionne mais pas exactement ce que vous voulez ou je voulais il y a quelque temps, mais P6Spy fonctionne parfaitement ,
voici le tutoriel simple à mettre en œuvre ainsi que le tutoriel MKYONG pour P6Spy .
pour moi, cela a fonctionné comme un charme.
Obtenez le «p6spy-install.jar»
Extrayez le
p6spy-install.jar
fichier, recherchezp6spy.jar
etspy.properties
Ajoutez
p6spy.jar
à votre dépendance de bibliothèque de projetModifiez votre fichier de configuration de base de données. Vous devez remplacer votre pilote JDBC existant par un pilote JDBC P6Spy -
com.p6spy.engine.spy.P6SpyDriver
L'original est le pilote MySQL JDBC -
com.mysql.jdbc.Driver
Changé en pilote JDBC P6Spy -
com.p6spy.engine.spy.P6SpyDriver
spy.properties
Remplacez le
real driver
par votre pilote JDBC MySQL existantModifier l'emplacement du fichier journal Modifiez l'emplacement du fichier journal dans la propriété logfile, toutes les instructions SQL se connecteront à ce fichier.
les fenêtres
*rien
“spy.properties”
dans le chemin de classe du projetCopiez
“spy.properties”
dans le dossier racine de votre projet, assurez-vous que votre projet peut localiser «spy.properties», sinon il invitera une“spy.properties”
exception de fichier introuvable.la source
la source
En utilisant Hibernate 4 et slf4j / log4j2, j'ai essayé d'ajouter les éléments suivants dans ma configuration log4j2.xml:
Mais sans succès.
J'ai découvert à travers ce fil que le framework jboss-logging utilisé par hibernate devait être configuré afin de se connecter via slf4j. J'ai ajouté l'argument suivant aux arguments VM de l'application:
Et ça a fonctionné comme un charme.
la source
Voici ce qui a fonctionné pour moi, défini ci-dessous dans le fichier log4j.file:
Paramètres des propriétés de mise en veille prolongée:
la source
pour le développement avec Wildfly (standalone.xml), ajoutez ces enregistreurs:
la source
si vous utilisez hibernate 3.2.xx, utilisez
au lieu de
la source
Vous pouvez vous connecter:
Exemple de sortie:
la source
Le plugin Log4Jdbc serait le mieux adapté à vos besoins. Cela montre:
Référez-vous au lien ci-dessous pour configurer Log4Jdbc-
la source
Utilisez Wireshark ou quelque chose de similaire:
Aucune des réponses mentionnées ci-dessus n'imprimera correctement sql avec des paramètres ou n'est une douleur. J'ai atteint cet objectif en utilisant WireShark , qui capture toutes les commandes sql / envoyées de l'application à Oracle / Mysql, etc. avec les requêtes.
la source
Toutes les réponses ici sont utiles, mais si vous utilisez un XML de contexte d'application Spring pour configurer votre fabrique de sessions, la définition de la variable de niveau log4j SQL ne vous y permet que partiellement, vous devez également définir la variable hibernate.show_sql dans le contexte de l'application elle-même pour que Hibernate commence à afficher réellement les valeurs.
ApplicationContext.xml a:
Et votre fichier log4j a besoin
la source
En Java:
Transformez votre requête en TypedQuery s'il s'agit d'une requête de critères (javax.persistence).
Alors:
query.unwrap (org.hibernate.Query.class) .getQueryString ();
la source
Hibernate affiche la requête et leurs valeurs de paramètre sur différentes lignes.
Si vous utilisez application.properties dans Spring Boot et que vous pouvez utiliser le paramètre en surbrillance ci-dessous dans application.properties.
org.hibernate.SQL affichera les requêtes
logging.level.org.hibernate.SQL = DEBUG
org.hibernate.type affichera toutes les valeurs des paramètres, qui seront mappées avec les requêtes de sélection, d'insertion et de mise à jour. logging.level.org.hibernate.type = TRACE
org.hibernate.type.EnumType affichera la valeur du paramètre de type enum
logging.level.org.hibernate.type.EnumType = TRACE
exemple ::
sql.BasicBinder affichera la valeur du paramètre de type entier, varchar, booléen
logging.level.org.hibernate.type.descriptor.sql.BasicBinder = TRACE
exemple ::
la source
La solution la plus simple pour moi consiste à implémenter un stringReplace normal pour remplacer les entrées de paramètres par des valeurs de paramètres (en traitant tous les paramètres comme des chaînes, pour plus de simplicité):
ou quelque chose de similaire pour les paramètres de position (?).
Prenez soin des valeurs nulles et des types de valeurs spécifiques comme la date, si vous voulez qu'un SQL prêt à être exécuté soit enregistré.
la source