0

Рассмотрим эту базу данных модели: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 ? 

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

  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, однако, кажется, не распознает левый join (загруженные платежи).

Просьба сообщить.

Спасибо!

+0

Поскольку у вас уже есть работающий запрос SQL, и не волнует, если это SQL, HQL или что-нибудь else, почему бы вам не использовать SQL-запрос? –

+0

Да, я бы хотел, но мне все равно нужно создавать сущности из результата, и я не знаю, как это сделать. – user315648

ответ

2

Вы можете использовать формулу 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)"/> 

Ref: How to map a property with formula in NHibernate?

+0

Вау, функция NICE. Благодаря! – user315648