NHibernate - Смешивание подзапроса и нетерпеливое соединение слева - PullRequest
0 голосов
/ 11 января 2012

Рассмотрим эту модель базы данных:

Product         Payment         Info          
-------         -------         --------
Id              Id              Id
Name            Value           Year
                Date            Description
                ProductId       ProductId

Мое желание - запросить все продукты (по их названию) из базы данных, с нетерпением ждать загрузки их платежей, а также

добавить описание из Info по некоторому параметру. (Postgre) SQL будет выглядеть примерно так:

Select product.Id, product.Name, payment.Value, payment.Date,
   (select inf.Description from Info inf 
    where inf.ProductId = product.Id where inf.Year = 2010 limit 1) as Description
from product left outer join payment on product.Id = payment.ProductId
where product.Name like ?

Однако у меня есть две основные проблемы:

  1. Как выполнить запрос в NHibernate (независимо от того, используется ли он в SQL, HQL, Criteria API, QueryOver, LINQ и т. Д.)?

Я подозреваю, что мне нужно спроектировать Category.Description, поэтому я придумал это:

var subquery = DetachedCriteria.For<Info>("inf")
    .Add(Restrictions.EqProperty("inf.Product.Id", "p.Id"))
    .Add(Restrictions.Eq("Year", 2010)).
.SetProjection(Projections.Property("inf.Description"));

var criteria = session.CreateCriteria<Product>("p")
    .Add(Restrictions.Eq("Product.Id", 12345678))
    .SetProjection(
        Projections.Property("p.Id"),
        Projections.Property("p.Name"),
        Projections.Property("p.Payments"),
        Projections.Alias(Projections.SubQuery(subquery), "p.Description"));

criteria.SetFetchMode("p.Payments", FetchMode.Eager);

Однако это не работает. Как я могу создать подзапрос и все еще стремиться получить платежи?

  1. Как создать сущности (бины) из набора результатов?

Я хочу создать из результатов следующие объекты:

public class Product
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
    public virtual string Description { get; set; }
    public virtual IList<Payment> Payments { get; set; }
}

public class Payment
{
    public virtual int Id { get; set; }
    public virtual Product Product { get; set; }
    public virtual double Value { get; set; }
    public virtual DateTime Date { get; set; }
}

Поскольку я использую проекции, это похоже на случай с AliasToBeanResultTransformer, однако он не распознает мое левое соединение (загруженные платежи).

Пожалуйста, сообщите.

Спасибо!

1 Ответ

2 голосов
/ 11 января 2012

Вы можете использовать формулу NHibernate, чтобы получить значение описания

<property name="Description" type="Type,Namespace" formula="(select inf.Description from Info inf 
where inf.ProductId = product.Id where inf.Year = 2010 limit 1)"/>

Ссылка: Как отобразить свойство с формулой в NHibernate?

...