Des associations encore plus complexes sont extrêmement rares. Hibernate permet de gérer des situations plus complexes en utilisant des parties SQL dans les fichiers de mapping.
Par exemple, si une table avec l'historiques des informations d'un compte définit les colonnes accountNumber, effectiveEndDate et effectiveStartDate, mappées de telle sorte:
<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"/>alors nous pouvons mapper une association à l'instance courante (celle avec une effectiveEndDate) nulle en utilisant:
<many-to-one name="currentAccountInfo"
property-ref="currentAccountKey"
class="AccountInfo">
<column name="accountNumber"/>
<formula>'1'</formula>
</many-to-one>Dans un exemple plus complexe, imaginez qu'une association entre Employee et Organization est gérée dans une table Employment pleines de données historiques. Dans ce cas, une association vers l'employeur le plus récent (celui avec la startDate la plus récente) pourrait être mappée comme cela:
<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>Vous pouvez être créatif grace à ces possibilités, mais il est généralement plus pratique d'utiliser des requêtes HQL ou criteria dans ce genre de situation.