2

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

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

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; }
}

我的 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 加入,我是否遗漏了一些明显的东西?

谢谢

4

1 回答 1

1

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

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

...如休眠文档中所述。这应该只执行一个 SQL 选择语句并检索所有内容,而无需任何映射更改。

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

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

更多信息可在休眠查询语言页面上找到

于 2010-03-16T14:59:47.753 回答