2011-01-07 9 views
2

通常、テーブルクラスごとに1:1のマッピングを作成します。NHibernateを使用して複数のテーブルの結果を返すプロシージャを呼び出す方法は?

例(テーブル):
[ユーザー]
USER_ID - PK


[トランザクション]
USER_ID - FK
ITEM_ID


例マッピング:
public class User
{
公開ストリングID {get; set;}
public string Name {get;セット;}
}

パブリッククラスの取引
{
公共の文字列のユーザーID {取得します。 set;}
公開ストリングItemID {get; set;}
公開10進数{get; set;}
}

しかし、最適化の問題や、結果を照会する際に操作が必要になることがあります。私たちは通常、複数のテーブルの結果を返すストアドプロシージャを使用します。 上記の例を使用すると、結合されたテーブルの結果を返すプロシージャをどのように呼び出すことができますか?この新しい組み合わせのレコードのためだけに新しいクラスとバインディングを作成せずに可能ですか?

ありがとうございます!

答えて

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> 

この例では、トランザクションは、ユーザクラスにバッグとしてマッピングされていることを前提としています。カスタムSQLクエリの使用に関する

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

NHibernateのドキュメントはhereです:C#のから次のようにして、このクエリを使用します。

乾杯、 Gerke。

+0

さらに複雑なカスタムSQLマッピングの例があります。かなり複雑なカスタムSQLマッピングの例は、http://nhibernate.svn.sourceforge.net/viewvc/nhibernate/trunk/nhibernate/src/で見つけることができます。 NHibernate.Test/NHSpecificTest/NH1612/Mappings.hbm.xml?revision = 3974 –

+0

ありがとう!しかし、どのようにしてオブジェクト(ユーザクラスとトランザクションクラス)のリストで結果を得ることができますか?申し訳ありませんが、NHibernateではまだ新しいです。私はGetNamedQueryを使うことができると思いますが、結果を得るためにはどのメソッドを呼び出す必要がありますか? – eSPiYa

+0

答えを更新しました。 –

関連する問題