Nhibernate / Hibernate, справочные таблицы и объектный дизайн - PullRequest
2 голосов
/ 16 марта 2010

У меня есть два стола. Счет-фактура со столбцами CustomerID, InvoiceDate, Value, InvoiceTypeID (CustomerID и InvoiceDate составляют составной ключ) и InvoiceType со столбцами InvoiceTypeID и InvoiceTypeName.

Я знаю, что могу создавать свои объекты, как:

public class Invoice
{
    public virtual int CustomerID { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Value { get; set; }
    public virtual InvoiceType InvoiceType { get; set; }
}

public class InvoiceType
{
    public virtual InvoiceTypeID { get; set; }
    public virtual InvoiceTypeName { get; set; }
}

Таким образом, сгенерированный sql будет выглядеть примерно так:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID FROM Invoice WHERE CustomerID = x AND InvoiceDate = y
SELECT InvoiceTypeID, InvoiceTypeName FROM InvoiceType WHERE InvoiceTypeID = z

Но скорее, если бы два запроса на выбор выполнялись для извлечения данных, я бы предпочел один. Я также хотел бы избежать использования дочернего объекта для простых списков поиска. Так что мой объект будет выглядеть примерно так:

public class Invoice
{
    public virtual int CustomerID { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Value { get; set; }
    public virtual InvoiceTypeID { get; set; }
    public virtual InvoiceTypeName { get; set; }
}

И мой sql будет выглядеть примерно так:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID 
FROM Invoice INNER JOIN InvoiceType ON Invoice.InvoiceTypeID = InvoiceType.InvoiceTypeID
WHERE CustomerID = x AND InvoiceDate = y

У меня вопрос, как мне создать сопоставление для этого?

Я пытался использовать соединение, но пытался объединиться с помощью CustomerID и InvoiceDate, я что-то упускаю из виду?

Спасибо

1 Ответ

1 голос
/ 16 марта 2010

Если ваша цель (как вы сказали) избежать двух запросов, вы можете получить данные с помощью одного оператора HQL:

select i, it from Invoice i fetch join i.type it where ...

... как задокументировано в спящем режиме документы . Это должно выполнить только один оператор SQL select и извлечь все без изменений сопоставления.

Это обычный HQL-запрос, который выполняется следующим образом:

IQuery q = s.CreateQuery("select i, it from Invoice i fetch join i.type it where ...");
IList invoices = q.List();

Более подробная информация доступна на языке запросов гибернации page .

...