2

2つのテーブルがあります。CustomerID、InvoiceDate、Value、InvoiceTypeID(CustomerIDとInvoiceDateは複合キーを構成します)列を持つInvoiceと、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

しかし、データを取得するために2つのselectクエリを実行するのではなく、1つを使用したいと思います。また、単純なルックアップリストに子オブジェクトを使用することは避けたいと思います。したがって、私のオブジェクトは次のようになります。

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

(あなたが言ったように)2つのクエリを回避することが目標である場合は、単一のHQLステートメントを使用してデータを取得できます。

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

...休止状態のドキュメントに記載されているとおり。これにより、SQL selectステートメントが1つだけ実行され、マッピングを変更せずにすべてを取得する必要があります。

これは通常のHQLクエリであり、次のように実行されます。

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

詳細については、Hibernateクエリ言語ページを参照してください。

于 2010-03-16T14:59:47.753 に答える