代码之家  ›  专栏  ›  技术社区  ›  lancscoder

nhibernate/hibernate、查找表和对象设计

  •  2
  • lancscoder  · 技术社区  · 16 年前

    我有两张桌子。列为customerid、invoicedate、value、invoicetypeid(customerid和invoicedate组成组合键)的发票,列为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
    

    但是,如果执行两个select查询来检索数据,我宁愿使用一个查询。我还想避免使用子对象进行简单的查找列表。所以我的东西看起来像:

    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进行连接,我是否遗漏了一些明显的东西?

    谢谢

    1 回复  |  直到 14 年前
        1
  •  1
  •   Tomislav Nakic-Alfirevic    14 年前

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

    select i, it from Invoice i fetch join i.type it where ...
    

    …如冬眠记录 docs . 这应该只执行一个sql select语句,并检索所有内容而不进行任何映射更改。

    这是一个常规hql查询,执行如下:

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

    有关hibernate查询语言的更多信息 page .

    推荐文章