Я использую JPQL для модельных запросов из Play Framework.Как выполнить сложное условие LEFT JOIN в JPQL?
Интересно, поддерживает ли JPQL «сложное» условие ВКЛ для ЛЕВЫЙ ОБЪЕДИНЕНИЕ.
В примере у меня есть 2 таблицы:
- 'App' - список приложений
- 'AggregationHistory' - список записей агрегации для каждого приложения, на сегодняшний день. В модели, она имеет поле «приложение», представляющее многие-к-одному с «App» (имя столбца «APP_ID» в физической таблице)
Предположим, я хочу, чтобы вычислить список всех приложений, которые не У вас есть запись на конкретную дату.
В простой SQL я получаю результат, используя следующий запрос:
SELECT a.* FROM app a LEFT JOIN aggregationhistory ah
ON a.id = ah.app_id AND ah.fromDate = '2012-03-14 00:00:00'
WHERE ah.fromDate is NULL
«И» в «ON» условие является существенным, конечно.
Теперь все примеры JPQL я вижу, как:
SELECT a.* FROM AggregationHistory ah LEFT JOIN ah.app a WHERE ...
Таким образом, только «ON» состоянии поддерживается - это «совпадение» идентификаторов? (Где, кажется, не поможет мне много)
Я могу думать о обходных (например, с использованием «родной запроса», или с помощью JOIN, чтобы получить список приложений, которые действительно имеют запись и сравнить). Но мне интересно, может ли запрос, который я сделал в SQL, преобразовать в JPQL.
Благодаря
Спасибо. Только одно, чтобы уточнить ... В текущей модели у меня нет «a.history» - просто «ah.app». Я попытался сделать это через: FROM AggregationHistory ah RIGHT JOIN ah.app a WITH ah.fromDate =: fromDate. К сожалению, получение: InvalidWithClauseException: выражения with-clause не ссылались на элемент-clause, к которому было привязано условие with-clause. Похоже, что WITH рассчитывает использовать 'a', а не 'ah'. Единственное решение - добавить «a.history»? Спасибо – Max
Честно говоря, я не знаю. Но наличие двунаправленных ассоциаций чрезвычайно помогает формулировать запросы в целом и, таким образом, полезно, даже если оно никогда не используется (или даже не отображается) в объектной модели. –