Как я могу получить сгенерированный запрос Toplink с помощью getTranslatedSQLString?

Итак, что я делаю, так это создаю подзапрос, который получает список значений ID, затем основной запрос получает все необходимые значения и добавляет порядок.

У меня есть это:

ReportQuery querySub = new ReportQuery(Predmet.class, generatedExpression);
querySub.addAttribute("m_id");

DatabaseRow row = new DatabaseRow();
querySub.prepareCall(getSession(), row);

// This part is the problem
String sql = querySub.getTranslatedSQLString(getSession(), row);

Проблема с этим кодом в том, что он не возвращает TranslatedSQLString, он возвращает тот же результат, что и querySub.getSQLString(). Теперь во всех примерах кода, которые я видел, они либо инстансировали строку как новый объект, либо не удосужились написать, откуда они взяли ссылку, но в любом случае это не работает (проблема с версией TopLink?). Я предполагаю, что мне нужно заполнить объект DatabaseRow самостоятельно, но я не могу найти ни одного примера в Интернете.


person Andrija    schedule 05.10.2011    source источник


Ответы (2)


Мне не удалось найти способ сделать это с помощью getTranslatedSQLString. Я полагаю, что DatabaseRow необходимо заполнить, но мне еще предстоит найти правильный способ. На данный момент я использую замену «грубой силы», я «запоминаю» все свои параметры и выполняю поиск/замену для каждого «?» войдите в запрос.

person Andrija    schedule 10.10.2011

вам нужно получить сеанс следующим образом:

JpaHelper.getDatabaseSession(getEntityManager().getEntityManagerFactory());

База данных, которая вам нужна:

TypedQuery<T> typedQuery = getEntityManager().createQuery(cq);
DatabaseQuery databaseQuery = typedQuery.unwrap(JpaQuery.class).getDatabaseQuery();

Итак, последний пример:

Session session = JpaHelper.getDatabaseSession(getEntityManager().getEntityManagerFactory());
DatabaseQuery databaseQuery = null;
if(typedQuery instanceof EJBQueryImpl)
    databaseQuery = ((EJBQueryImpl<T>)typedQuery).getDatabaseQuery();
else
    databaseQuery = typedQuery.unwrap(JpaQuery.class).getDatabaseQuery();
sql = databaseQuery.getTranslatedSQLString(session, databaseQuery.getTranslationRow());

Это работает для меня.

person Fábio Almeida    schedule 24.04.2015