Je veux sortir le SQL généré par EclipseLink sur la console, pendant le développement. Cependant, je ne pouvais le faire qu'en utilisant le niveau d'enregistrement FINE. J'ai un modèle de domaine complexe composé de nombreuses classes, à tel point que le déploiement prend beaucoup de temps lorsque la verbosité du journal est au niveau FINE, car EclipseLink génère son analyse de l'ensemble du modèle.
Existe-t-il un moyen d'obtenir le SQL sans recourir au niveau de journalisation FINE (comme le fait Hibernate)?
Mettez les propriétés suivantes dans votre persistence.xml
:
<property name="eclipselink.logging.level.sql" value="FINE"/>
<property name="eclipselink.logging.parameters" value="true"/>
Ce dernier est utile pour que les valeurs du paramètre soient affichées.
Une alternative utilise log4jdbc ou log4jdbc-remix .
La génération de journaux pour EclipseLink semble assez difficile à définir, selon ce fil.
Il mentionne un persistence.xml
fichier avec niveau log que vous pouvez adapter:
<property name="eclipselink.weaving" value="static" />
<property name="eclipselink.logging.level.sql" value="FINEST" />
<property name="eclipselink.logging.level" value="FINEST" />
<property name="eclipselink.logging.level.cache" value="FINEST" />
Mais d'autres paramètres peuvent être nécessaires.
Comme Martin documents ci-dessous , " EclipseLink/Exemples/JPA/Logging " documente ces propriétés.
Pour obtenir le SQL d'une requête spécifique au moment de l'exécution, vous pouvez utiliser l'API DatabaseQuery.
Query query = em.createNamedQuery("findMe");
Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
String sqlString = databaseQuery.getSQLString();
Ce SQL contiendra? pour les paramètres. Pour obtenir le SQL traduit avec les arguments, vous avez besoin d'un DatabaseRecord avec les valeurs des paramètres.
DatabaseRecord recordWithValues= new DatabaseRecord();
recordWithValues.add(new DatabaseField("param1"), "someValue");
String sqlStringWithArgs =
databaseQuery.getTranslatedSQLString(session, recordWithValues);