У меня есть Unit, который имеет UnitType и организацию. У меня есть Контракт, в котором есть коллекция UnitTypes и Организация. Я хотел бы выбрать модуль и либо контракт, в котором имеется UnitType модуля, либо ИЛИ UnitType с пустой коллекцией UnitType, если совпадения нет.
Чтобы уточнить, в каждом случае я хочу выбрать Единицу. Если существует Контракт с указанным типом модуля в коллекции контрактов UnitTypes, то я бы хотел выбрать этот контракт. Если такого контракта не существует, я бы хотел выбрать тот Контракт, в котором нет UnitTypes. Другими словами, я хотел бы, чтобы контракт, который применяется к типу этого юнита, но если он не существует, я возьму контракт, который является независимым от типа юнита, по умолчанию.
Пример 1:
Unit A has type XYZ.
Contract B has types [ ABC, DEF ]
Contract C has types []
в этом случае я бы выбрал единицу и Контракт C, потому что B не соответствует типу.
Пример 2:
Unit A has type XYZ
Contract B has types [XYZ, ABC]
Contract C has types []
В этом случае я бы выбрал Контракт B, поскольку он соответствует типу Юнита.
Следующий запрос работает для примера 2, но не для примера 1.
SELECT NEW mypackage.view.MyAggregateView(
u
, MAX(sc.serviceDate)
, c.survey.key )
FROM Contract c
, Unit u
LEFT JOIN u.serviceCalls sc
WHERE c.organization.key = u.organization.key
AND u.organization.key = :organizationKey
AND ((u.unitType MEMBER OF c.unitTypes)
OR (c.unitTypes IS EMPTY))
GROUP BY u, c.survey.key
Как мне выполнить эту работу в обоих случаях и убедиться, что я получаю правильный контракт?
Еще один пример:
Я недавно столкнулся с этим снова. У меня есть регион, в котором есть коллекция почтовых индексов и, при желании, коллекция организаций. У меня также есть подразделение, которое имеет 1-1 для организации и имеет один почтовый индекс. Я хочу получить все соответствующие единицы в почтовых индексах региона. Если в регионе нет организаций, я должен получить все единицы в почтовых индексах, в противном случае я должен получить только те единицы, в которых есть организация, соответствующая одной из организаций, указанных в этом регионе.
Вот мой запрос
Select u.key, u.organization.key
from Unit u, Region r
where r.key = -1
and u.address.postalCode member of r.zips
and r.organizations is empty
Этот запрос возвращает мне все ожидаемые результаты. Следующий запрос, который никоим образом не должен ограничивать набор результатов, так как он только добавляет OR, не дает мне никаких результатов.
Select u.key, u.organization.key
from Unit u, Region r
where r.key = -1
and u.address.postalCode member of r.zips
and ((r.organizations is empty) OR (r.organizations is not empty and u.organization member of r.organizations))
Я использую ссылку eclipse 2.0.1 против postgres 9. Я также получил тот же результат с eclipselink 2.2.0.