Anybody know how to generate the following sql query using NHibernate QueryOver?
SELECT this_.Id as Id2_1_, this_.name as name2_1_, this_.rp_id as rp3_2_1_, rtlprd1_.Id as Id3_0_, rtlprd1_.name as name3_0_ FROM receipt this_ left outer join rtl_prd rtlprd1_ on this_.rp_id=rtlprd1_.Id left join ( SELECT ... )
Mapping by code:
class Receipt
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
public virtual RtlPrd RtlPrd { get; set; }
public virtual JoinClass JoinClass { get; set; }
}
class ReceiptMap : ClassMapping<Receipt>
{
public ReceiptMap()
{
Table("receipt");
Id(x => x.Id);
Property(x => x.Name, m => m.Column("name"));
ManyToOne(x => x.RtlPrd, m =>
{
m.Column("rp_id");
m.Cascade(Cascade.None);
});
ManyToOne(x => x.JoinClass, m =>
{
m.Column("rp_id");
m.Cascade(Cascade.None);
});
}
}
class RtlPrd
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
class RtlPrdMap : ClassMapping<RtlPrd>
{
public RtlPrdMap()
{
Table("rtl_prd");
Id(x => x.Id);
Property(x => x.Name, m => m.Column("name"));
}
}
class LnkPrdType
{
public virtual int LptId { get; set; }
public virtual string Name { get; set; }
}
class LnkPrdTypeMap : ClassMapping<LnkPrdType>
{
public LnkPrdTypeMap()
{
Table("lnk_prd_type");
Id(x => x.LptId, m => m.Column("lpt_id"));
Property(x => x.Name, m => m.Column("name"));
}
}
class LnkPrd
{
public virtual int LpId { get; set; }
public virtual string Name { get; set; }
public virtual LnkPrdType LnkPrdType { get; set; }
public virtual RtlPrd RtlPrd { get; set; }
}
class LnkPrdMap : ClassMapping<LnkPrd>
{
public LnkPrdMap()
{
Table("lnk_prd");
Id(x => x.LpId, m => m.Column("lp_id"));
Property(x => x.Name, m => m.Column("name"));
ManyToOne(x => x.LnkPrdType, m =>
{
m.Column("lpt_id");
m.Cascade(Cascade.None);
});
ManyToOne(x => x.RtlPrd, m =>
{
m.Column("rpt_id");
m.Cascade(Cascade.None);
});
}
}
class JoinClass
{
public virtual int Id { get; set; }
}
class JoinClassMap : ClassMapping<JoinClass>
{
public JoinClassMap()
{
// TODO: need add WHERE condtion in subselect
Subselect(@"SELECT lp.lp_id
FROM lnk_prd lp JOIN lnk_prd_type lpt ON lp.lpt_id = lpt.lpt_id");
Id(x => x.Id, m => m.Column("lp_id"));
}
}
Sample join using query
Receipt receipt = null;
RtlPrd rtlPrd = null;
JoinClass joinClass = null;
var query = session.QueryOver(() => receipt)
.Left.JoinAlias(() => receipt.RtlPrd, () => rtlPrd)
.Left.JoinAlias(() => receipt.JoinClass, () => joinClass)
.SelectList(list =>
list.Select(() => receipt.Id))
.List();