Nhibernate/Hibernate、查找表和对象设计
我有两张桌子。列为CustomerID、InvoiceDate、Value、InvoiceTypeID(CustomerID和InvoiceDate组成复合键)和InvoiceType列为InvoiceTypeID和InvoiceTypeName的发票 我知道我可以创建我的对象,如: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
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代码中执行这样的查询。