我有具有UNITTYPE和組織一股股JPA選擇。我有一個包含UnitType和一個組織的合同。我想選擇單位,以及在其集合中具有單位UnitType的合約,或者如果沒有匹配,則具有空UnitType集合的UnitType。基於集合元素匹配,或空集
爲了澄清,在任何情況下我想選擇的單位。如果在合同的UnitType集合中存在具有單位指定類型的合同,那麼我希望選擇該合同。如果這樣的合同不存在,那麼我想選擇根本沒有UnitType的合同。換句話說,我希望適用於本單位類型的合約,但是如果它不存在,我將把單位類型不明的合約作爲默認值。
實施例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相同的結果。
你可以嘗試解釋一些例子嗎?我無法弄清楚你要在這兩個例子的每一個上搜索什麼,但你想要的結果是清楚的。 – Augusto 2011-05-18 19:40:01
補充說明。請讓我知道你是否需要更多。 – digitaljoel 2011-05-18 19:45:16
是你的模型是這樣的: 單位有\ @ManyToOne unitType和\ @ManyToOne組織;合同有\ @ManyToOne組織和\ @OneToMany unitType(或\ @ManyToMany?)。 我理解正確嗎? – wrschneider 2011-11-27 01:36:04