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.