NHibernate внутреннее соединение master-detail на столбце кроме идентификатора - PullRequest
0 голосов
/ 15 июля 2009

Допустим, следующие записи сопоставления:

<id name="InternalId" column="uintCustomerId" type="long">
  <generator class="identity" />
</id>

<!-- The BinaryBlob below is a 16 byte array - Think Guid.NewGuid().ToByteArray -->
<property name="CustomerUid" column="uidCustomerId" type="BinaryBlob" not-null="true" /> 
<property name="Name" column="strFullName" type="String" not-null="true" />
<property name="Age" column="intAge" type="System.Int32" not-null="true" />

<set name="Orders" table="order" generic="true" inverse="false" lazy="false" cascade="all">
  <key column="uidCustomerId" />
  <one-to-many class="Order" />
</set>

<id name="InternalId" column="uintOrderId" type="long">
  <generator class="identity" />
</id>

<!-- This BinaryBlob is a 16 byte array - Think Guid.NewGuid().ToByteArray -->
<property name="CustomerUid" column="uidCustomerId" type="BinaryBlob" not-null="true" /> 

<property name="OrderDate" column="datOrderDate" type="System.DateTime" not-null="true" />

Таким образом, есть 2 класса: Клиент - Заказ со свойствами, как определено в приведенном выше отображении

Клиент - это uintCustomerId

Порядок заказа uintOrderId

uidCustomerId - это уникальный ключ в таблице Customer и fk to Customer в таблице Order. uidCustomerId является двоичным (16)

База данных не может быть изменена.

Учитывая вышеизложенное. Как мы можем запросить с помощью API-интерфейса NHibernate Criteria, чтобы доставить Клиента и связанные с ним Заказы после указанной даты. ПРИМЕЧАНИЕ. Нам нужно присоединиться к uidCustomerId, который не является первичным ключом.

Это можно сделать с помощью API Criteria? Это можно сделать с помощью HQL?

Спасибо, Тасос

1 Ответ

1 голос
/ 17 июля 2009

Я пробовал то же самое, что и тебе. Вот код, который я использовал (без тестирования).

IList customers = sess.CreateCriteria(typeof(Customer))
    .CreateAlias("Orders", "order")  
    .CreateAlias("order.OrderDate", "orderdate")
    .Add( Expression.Ge("orderdate", somedate) )
    .List();

Вот хороший справочник по NH CreateAlias ​​

...