2016-09-09 3 views
2

私はC#言語を使ってNHibernateを使ってWebアプリケーションを開発しています。しかし、私はいくつかのフィールドとマッピングだけでネイティブのMySQLクエリを構築することはできません。NHibernateとネイティブSQLを使ってテーブルからいくつかのカラムだけを選択

マイのhbm.xmlは、次のようになります。

var session = this.GetFactory().OpenSession(); 
      var query = session.CreateSQLQuery("SELECT * FROM `rule` WHERE currency = :currency AND `range` = :range"); 
      query.SetParameter("currency", this.SearchRoot.Currency.Id); 
      query.SetParameter("range", this.SearchRoot.Range.Id); 
      query.AddEntity(typeof(Rule)); 

      var rules = query.List<Rule>(); 

私は私のアプリを実行すると、すべての罰金です:

<class name="Rule" table="rule"> 
    <id name="Id" column="id" type="int"> 
     <generator class="native"></generator> 
    </id> 
    <property name="Name" column="name" type="String" not-null="false"></property> 
    <property name="Description" column="description" type="String" not-null="false"></property> 
    <property name="Shops" column="shops" type="String" not-null="false"></property> 
    <property name="Channels" column="channels" type="String" not-null="false"></property> 
    <property name="Currency" column="currency" type="int" not-null="false"></property> 
    <property name="Range" column="range" type="int" not-null="false"></property> 
    <property name="Created" column="created" type="DateTime" ></property> 
    <property name="Modified" column="modified" type="DateTime" ></property> 
    </class> 

私のネイティブクエリは次のようになります。しかし、この特定のケースのために、私は次のように変更しましたので、私はちょうど、ID、お店やチャンネルを必要とするすべてのフィールドは必要ありません。

例外の詳細:

var session = this.GetFactory().OpenSession(); 
      var query = session.CreateSQLQuery("SELECT id, shops, channels FROM `rule` WHERE currency = :currency AND `range` = :range"); 
      query.SetParameter("currency", this.SearchRoot.Currency.Id); 
      query.SetParameter("range", this.SearchRoot.Range.Id); 
      query.AddEntity(typeof(Rule)); 

      var rules = query.List<Rule>(); 

をそれから私は、次のエラーを得ました: System.IndexOutOfRangeException:結果で指定された列を見つけることができませんでした:名前

私は、NHibernateが常にテーブルのフィールドとクラスのプロパティを一致させることを理解します。ネイティブクエリに関するドキュメントを読んでいます。

nhibernate native query

しかし、私は、任意のサンプルまたはこの特定のケースに関連する何かを見つけることができません。

助けが必要ですか?

答えて

1

驚くほど簡単です:

  1. ませ使用AddEntity(typeof(MyEntity)
  2. 使用変圧を行うTransformers.AliasToBean<MyEntity>()

しかし、今、私たちは、SQL SELECT文の変更する必要があります。

...

var query = session.CreateSQLQuery("SELECT id as ID, shops as Shop ...."); 
... 
//query.AddEntity(typeof(Rule)); 
query.SetResultTransformer(Transformers.AliasToBean<Rule>()) 

概要彼らはマッピングで定義されている通り、我々はすべての列を提供する場合、私たちは、直接エンティティにマッピングすることができます:10の

列の別名は、プロパティ名に

起草ソリューションと一致する必要があります。一致は列名とcolumn=""マッピングによって駆動されます。私たちはまた、projectinを使用することができ、わずかな列を選択することができます...その場合、name=""マッピングに等しいエイリアスを提供し、Transformerを使用する必要があります。 more complex projectionも使用できます)

+1

ありがとうございます。トランスフォーマーはこの場合の解決策です。 – afym

関連する問題