#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());
Это работает для меня.