Как получить строку SQL из JPQLQuery - PullRequest
3 голосов
/ 20 июня 2011

Я использую EclipseLink.

У меня есть JPQL-запрос, и я хочу получить строку sql .. Теперь я делаю так:

EJBQueryImpl qi = (EJBQueryImpl)jpqlQuery;
String sqlQueryString = qi.getDatabaseQuery().getSQLString();

Проблемав том, что в sqlQueryString константу заменяют на?

Я пытался получить значения, перемещаясь по деревьям выражений (getSelectionCriteria() и getHavingCriteria()), но таким образом я терял тип ...

Есть ли у кого-нибудь проблемы, подобные этой?

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Цитируется из EclipseLink FAQ :

Чтобы просмотреть SQL для запроса JPA, вы можете включить ведение журнала в FINE или ниже.

Чтобы получитьSQL для конкретного запроса во время выполнения вы можете использовать API DatabaseQuery.

Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
databaseQuery.prepareCall(session, new DatabaseRecord());
String sqlString = databaseQuery.getSQLString();

Этот SQL будет содержать?для параметров.Для перевода SQL с аргументами вам необходим DatabaseRecord со значениями параметров.

Session session = em.unwrap(JpaEntityManager.class).getActiveSession();
DatabaseQuery databaseQuery = ((EJBQueryImpl)query).getDatabaseQuery();
String sqlString = databaseQuery.getTranslatedSQLString(session, recordWithValues);
0 голосов
/ 07 августа 2018

Вот метод, который работает:

public static void logJpaQuery(EntityManager em, TypedQuery tq){
        org.eclipse.persistence.sessions.Session session = em.unwrap(JpaEntityManager.class).getActiveSession();        
        DatabaseQuery dq = ((EJBQueryImpl) tq).getDatabaseQuery();
        AbstractRecord translationRow = dq.getTranslationRow();        
        dq.prepareCall(session, new DatabaseRecord());        
        String translatedSQLString = dq.getTranslatedSQLString(session, translationRow);
        log.trace("translated sql is: {}", translatedSQLString);
    }
...