web-dev-qa-db-fra.com

Est-il possible de générer du SQL généré à l'aide d'EclipseLink sans avoir à augmenter la verbosité du journal?

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

33
javabeats

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 .

58
jbandi

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.

22
VonC

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);

Source: Comment obtenir le SQL pour une requête

10
Tomasz