2012-03-14 3 views
2

Я использую 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.

Благодаря

ответ

9

JPQL, AFAIK, не поддерживает ON положения, но HQL поддерживает их. Предпочиталось использовать ключевое слово with:

select a from App a 
left join a.history h with h.fromDate = :fromDate 
where h.fromDate is null 
+0

Спасибо. Только одно, чтобы уточнить ... В текущей модели у меня нет «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

+0

Честно говоря, я не знаю. Но наличие двунаправленных ассоциаций чрезвычайно помогает формулировать запросы в целом и, таким образом, полезно, даже если оно никогда не используется (или даже не отображается) в объектной модели. –

Смежные вопросы