Рассмотрим эту базу данных модели:NHibernate - Смешивание подзапрос и нетерпеливый левое соединение
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, однако, кажется, не распознает левый join (загруженные платежи).
Просьба сообщить.
Спасибо!
Поскольку у вас уже есть работающий запрос SQL, и не волнует, если это SQL, HQL или что-нибудь else, почему бы вам не использовать SQL-запрос? –
Да, я бы хотел, но мне все равно нужно создавать сущности из результата, и я не знаю, как это сделать. – user315648