2009-07-15 3 views
0

Примем следующие записи отображения:NHibernate внутреннее соединение мастер-деталь на колонке, кроме идентификатора

< имя класса = таблицы "Клиент" = "клиент">

<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> 

< имя класса = "Order" таблица = "порядок">

<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

Орден PK является uintOrderId

uidCustomerId является уникальным ключом в таблице Customer и Ф.К. Клиенту на Таблица заказов uidCustomerId является двоичным (16)

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

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

Это что-то, что можно сделать с помощью API критериев? Это что-то, что можно сделать с помощью HQL?

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

+0

Я не понимаю. Если у вас уже есть сопоставление, почему бы вам просто не получить Клиента как обычно, чем ссылаться на заказы через простое свойство Customer.Orders? –

+0

Спасибо за ваш комментарий Mufasa Как бы вы выполняли запрос, если бы хотели, чтобы заказчик имел заказы после определенной даты? – Anastasiosyal

ответ

1

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

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

Вот хорошая ссылка для NH CreateAlias

+0

Спасибо за указатель в правильном направлении - я не знал о CreateAlias ​​и, что еще важнее, о том, как он позволяет делать объединения на произвольных столбцах, как я видел в образце dhforge doc через Expression.EqProperty («kt.Name», «mt. Имя ") IList кошки = sess.CreateCriteria (TypeOf (Cat)) .CreateAlias ​​(" Котята " "кТ") .CreateAlias ​​("Mate", "т") .Add (Expression.EqProperty (" kt.Name "," mt.Name ")) .List(); – Anastasiosyal

Смежные вопросы