Nhibernate/Hibernate、查找表和对象设计

Nhibernate/Hibernate、查找表和对象设计,nhibernate,hibernate,fluent-nhibernate,nhibernate-mapping,object-object-mapping,Nhibernate,Hibernate,Fluent Nhibernate,Nhibernate Mapping,Object Object Mapping,我有两张桌子。列为CustomerID、InvoiceDate、Value、InvoiceTypeID(CustomerID和InvoiceDate组成复合键)和InvoiceType列为InvoiceTypeID和InvoiceTypeName的发票 我知道我可以创建我的对象,如: public class Invoice { public virtual int CustomerID { get; set; } public virtual DateTime InvoiceD

我有两张桌子。列为CustomerID、InvoiceDate、Value、InvoiceTypeID(CustomerID和InvoiceDate组成复合键)和InvoiceType列为InvoiceTypeID和InvoiceTypeName的发票

我知道我可以创建我的对象,如:

public class Invoice
{
    public virtual int CustomerID { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Value { get; set; }
    public virtual InvoiceType InvoiceType { get; set; }
}

public class InvoiceType
{
    public virtual InvoiceTypeID { get; set; }
    public virtual InvoiceTypeName { get; set; }
}
因此,生成的sql看起来像:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID FROM Invoice WHERE CustomerID = x AND InvoiceDate = y
SELECT InvoiceTypeID, InvoiceTypeName FROM InvoiceType WHERE InvoiceTypeID = z
public class Invoice
{
    public virtual int CustomerID { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Value { get; set; }
    public virtual InvoiceTypeID { get; set; }
    public virtual InvoiceTypeName { get; set; }
}
但是,如果执行两个select查询来检索数据,我宁愿使用一个查询。我还希望避免将子对象用于简单的查找列表。所以我的物体看起来像:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID FROM Invoice WHERE CustomerID = x AND InvoiceDate = y
SELECT InvoiceTypeID, InvoiceTypeName FROM InvoiceType WHERE InvoiceTypeID = z
public class Invoice
{
    public virtual int CustomerID { get; set; }
    public virtual DateTime InvoiceDate { get; set; }
    public virtual decimal Value { get; set; }
    public virtual InvoiceTypeID { get; set; }
    public virtual InvoiceTypeName { get; set; }
}
我的sql看起来像:

SELECT CustomerID, InvoiceDate, Value, InvoiceTypeID 
FROM Invoice INNER JOIN InvoiceType ON Invoice.InvoiceTypeID = InvoiceType.InvoiceTypeID
WHERE CustomerID = x AND InvoiceDate = y
我的问题是如何创建此映射

我尝试过使用join,但这次尝试使用CustomerID和InvoiceDate加入,我是否遗漏了一些明显的东西

谢谢

如果您的目标是(如您所说)避免两次查询,则可以使用单个HQL语句检索数据:

select i, it from Invoice i fetch join i.type it where ...
…如hibernate中所述。这应该只执行一个SQL select语句,并检索所有内容,而不进行任何映射更改

这是一个常规的HQL查询,执行方式如下:

IQuery q = s.CreateQuery("select i, it from Invoice i fetch join i.type it where ...");
IList invoices = q.List();

有关hibernate查询语言的更多信息,请参阅。

谢谢您的回答,但您实际上是如何做到这一点的?您在哪里指定此HQL?在地图上?在代码中?我仍然不明白如何将查找表添加到映射中。谢谢。我已经用额外的代码更新了我的答案,以便更好地解释它。当您需要发票数据时,可以在OO代码中执行这样的查询。