更复杂的关联连接极为罕见。
通过在映射文档中嵌入SQL片断,Hibernate也可以处理更为复杂的情况。比如,假若包含历史帐户数据的表定义了accountNumber
, effectiveEndDate
和effectiveStartDate
字段,按照下面映射:
<properties name="currentAccountKey"> <property name="accountNumber" type="string" not-null="true"/> <property name="currentAccount" type="boolean"> <formula>case when effectiveEndDate is null then 1 else 0 end</formula> </property> </properties> <property name="effectiveEndDate" type="date"/> <property name="effectiveStateDate" type="date" not-null="true"/>
那么我们可以对目前(current)实例(其effectiveEndDate
为null)使用这样的关联映射:
<many-to-one name="currentAccountInfo" property-ref="currentAccountKey" class="AccountInfo"> <column name="accountNumber"/> <formula>'1'</formula> </many-to-one>
更复杂的例子,假想Employee
和Organization
之间的关联是通过一个Employment
中间表维护的,而中间表中填充了很多历史雇员数据。那“雇员的最新雇主”这个关联(最新雇主就是startDate
最后的那个)可以这样映射:
<join> <key column="employeeId"/> <subselect> select employeeId, orgId from Employments group by orgId having startDate = max(startDate) </subselect> <many-to-one name="mostRecentEmployer" class="Organization" column="orgId"/> </join>
使用这一功能时可以充满创意,但通常更加实用的是用HQL或条件查询来处理这些情形。