Рассмотрим следующие таблицы:
Client(Id bigint, Name varchar(50))
Employee(Id bigint, Name varchar(50), ClientId bigint)
которые отображаются так:
<class name="Client" table="`Client`">
<id name="Id" column="`Id`" type="long">
<generator class="native" />
</id>
<property name="Name" column="`Name`" />
<bag name="Employees" cascade="all" inverse="true" >
<key column="`ClientId`" />
<one-to-many class="Employee" />
</bag>
</class>
<class name="Employee" table="`Employee`">
<id name="Id" column="`Id`" type="long">
<generator class="native" />
</id>
<property name="Name" column="`Name`" />
<many-to-one name="Client" cascade="all" column="`ClientId`" />
</class>
Если я получаю клиента, я также получаю коллекцию сотрудников, где Employee.Client = Client.Id. Отлично.
Теперь рассмотрим это:
Client(Id bigint, Name varchar(50), AlternativeId int)
Employee(Id bigint, Name varchar(50), ClientId bigint, AlternativeClientId int)
Я хочу вернуть Клиенту с набором Сотрудников, где Employee.AlternativeClientId = Client.AlternativeId.
Я бы предположил, что ключевой узел теперь будет читать:
<key column="`AlternativeClientId`"/>
Но кроме этого я в тупике. Существуют фильтры, которые можно применять к коллекциям, но набор сотрудников во второй версии может не быть подмножеством сотрудников в первой версии, поэтому я не думаю, что это путь вперед. Я пытался, но это казалось тупиком. Есть ли способ указать запрос, но не только для Сотрудников, у которых есть ClientId = Client.Id?
(Для «почему»: это связано с тем, что разные системы имеют разные представления о данных.)