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

#java #toplink

#java #toplink

Вопрос:

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

Что у меня есть, так это:

 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() что и . Теперь во всем примере кода, который я видел, они либо создавали экземпляр row как новый объект, либо не удосужились написать, откуда они получили ссылку, но в любом случае это не работает (проблема с версией TopLink?). Я предполагаю, что мне нужно самому заполнить объект DatabaseRow, но я не могу найти ни одного примера в Интернете.

Ответ №1:

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

Ответ №2:

вам нужно получить сеанс, подобный этому:

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

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