2

通常、テーブルクラスごとに 1:1 のマッピングを作成します。

例 (テーブル):
[users]
user_id - PK
name

[transactions]
user_id - FK
item_id
amount

マッピングの例:
public class User
{
public string ID {get; セット;}
パブリック文字列名 {get; } set;}
}

public class Transaction
{
public string UserID {get; セット;}
パブリック文字列 ItemID {get; set;}
public Decimal Amount {get; } セット;}
}

ただし、最適化の懸念により、結果のクエリ中に実行する必要がある操作がある場合があります。通常、複数のテーブルから結果を返すストアド プロシージャを使用します。上記の例を使用すると、結合されたテーブルから結果を返すプロシージャを呼び出すにはどうすればよいでしょうか? この結合されたレコードのためだけに、新しいクラスを作成してバインドせずに可能ですか?

ありがとう!

4

1 に答える 1

3

この場合、次のようなマッピング構造を使用して、ストアドプロシージャを使用できます。

<sql-query name="LoadUsersAndTransactions" xml:space="preserve">
  <return class="User" alias="u">
    <return-property name="ID" column="user_id" />
    <return-property name="Name" column="name" />
  </return>
  <return-join property="u.Transactions" alias="t">
    <return-property name="key" column="user_id" />
    <return-property name="element" column="item_id" />
    <return-property name="element.id" column="item_id" />
    <return-property name="element.Amount" column="amount" />
  </return-join>
  EXEC dbo.SelectUsersAndTransactions :param_1, ..., :param_N
</sql-query>

この例では、TransactionsがUserクラスのバッグとしてマップされていることを前提としています。このクエリは、C#から次のように使用します。

IList<User> users = session
    .GetNamedQuery("LoadUsersAndTransactions")
    .SetString("param_1", parameterValue1)
    ...
    .SetString("param_N", parameterValueN)
    .List<User>();

カスタムSQLクエリの使用に関するNHibernateのドキュメントはこちらです。

乾杯、ゲルケ。

于 2011-01-08T22:11:01.430 に答える