Рассмотрим эту модель базы данных:
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 ?
Однако у меня есть две основные проблемы:
- Как выполнить запрос в 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);
Однако это не работает. Как я могу создать подзапрос и все еще стремиться получить платежи?
- Как создать сущности (бины) из набора результатов?
Я хочу создать из результатов следующие объекты:
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, однако он не распознает мое левое соединение (загруженные платежи).
Пожалуйста, сообщите.
Спасибо!