7.6. 更复杂的关联映射

更复杂的关联连接极为罕见。 通过在映射文档中嵌入SQL片断,Hibernate也可以处理更为复杂的情况。比如,假若包含历史帐户数据的表定义了accountNumber, effectiveEndDateeffectiveStartDate字段,按照下面映射:

  1. <properties name="currentAccountKey">
  2. <property name="accountNumber" type="string" not-null="true"/>
  3. <property name="currentAccount" type="boolean">
  4. <formula>case when effectiveEndDate is null then 1 else 0 end</formula>
  5. </property>
  6. </properties>
  7. <property name="effectiveEndDate" type="date"/>
  8. <property name="effectiveStateDate" type="date" not-null="true"/>

那么我们可以对目前(current)实例(其effectiveEndDate为null)使用这样的关联映射:

  1. <many-to-one name="currentAccountInfo"
  2. property-ref="currentAccountKey"
  3. class="AccountInfo">
  4. <column name="accountNumber"/>
  5. <formula>'1'</formula>
  6. </many-to-one>

更复杂的例子,假想EmployeeOrganization之间的关联是通过一个Employment中间表维护的,而中间表中填充了很多历史雇员数据。那“雇员的最新雇主”这个关联(最新雇主就是startDate最后的那个)可以这样映射:

  1. <join>
  2. <key column="employeeId"/>
  3. <subselect>
  4. select employeeId, orgId
  5. from Employments
  6. group by orgId
  7. having startDate = max(startDate)
  8. </subselect>
  9. <many-to-one name="mostRecentEmployer"
  10. class="Organization"
  11. column="orgId"/>
  12. </join>

使用这一功能时可以充满创意,但通常更加实用的是用HQL或条件查询来处理这些情形。