【发布时间】:2011-05-18 05:22:54
【问题描述】:
我有一个 Unit,它有一个 UnitType 和一个 Organization。我有一个包含 UnitTypes 和一个组织集合的合同。我想选择单位,以及在其集合中包含 Unit 的 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))
我在 postgres 9 上使用 eclipse link 2.0.1。我也使用 eclipselink 2.2.0 得到了相同的结果。
【问题讨论】:
-
你能试着解释一下这些例子吗?我无法弄清楚您要在这两个示例中的每一个上搜索什么,但您想要的结果很清楚。
-
添加了说明。如果您需要更多信息,请告诉我。
-
你的模型是这样的吗:Unit有\@ManyToOne unitType和\@ManyToOne组织;合同有 \@ManyToOne 组织和 \@OneToMany unitType(或 \@ManyToMany?)。我理解正确吗?