2009-03-04 12 views
1

2つのテーブル(ActiveRecordでマッピングされる)に対してクエリを実行したいとします。このクエリは、(カスタム集約情報のように)ActiveRecordオブジェクトにマッピングできない結果リストを返します。nHibernateを使用してマップされていないオブジェクトのリストを返すHqlBasedQueryを実行するにはどうすればよいですか?

暗い:= "ディーラーDからNbrLeadsとして別個d.ID、(todays_date < =をDATE_CREATED Sales_LeadsからEXP(1)カウントを選択)を選択し、" 文字列としてインスタンス

薄暗いquery_strについて

ICollectionを= ActiveRecordMediator.ExecuteQuery(Q)としてQueries.HqlBasedQuery =新Queries.HqlBasedQuery(メソッドGetType(ICollectionを)、query_str) q.SetParameter( "todays_date"、DateTime.Today) 点心としてQ私は「何

探しているのは、SQLの単純な実行です。 ActiveRecordオブジェクトが返されました。

したがって、理想的には、コレクションの各アイテムのi(「NbrResults」)を見ることができます。

私は取得していますエラーは次のとおりです。

あなたが適切に が初期化されていなかったのActiveRecord クラスにアクセスしました。文字列=「SELECTのよう

薄暗いquery_str:唯一の説明は ActiveRecordStarter.Initialize(への呼び出し) ここ

答えて

0

が私の最終的な解決策だった System.Collections.ICollectionクラスが含まれていなかったということです DISTINCT d.ID、LEADからのカウント(l)をlとして結合する.Dealerをdとしてl.DateCreated> DATEADD(day、-30、:todays_date)GROUP BY d.ID "

アクティブレコードを取得するセッション(またはNHibernate、ここでも返されるものはまだ分かりません):

として

薄暗いのSES ISession = activerecordmediator.GetSessionFactoryHolder()のCreateSession(メソッドGetType(ActiveRecordBase))NHibernate.IQuery = sess.CreateQuery(query_str)

q.SetParameter( "todays_date" として

薄暗いQ

0

ヨ:のIList = q.List(AS、DateTime.Today) 薄暗いI) 'の.aspxページで結果

を取得し、結果はそうようにGridViewにアクセスすることができますORMの精神に反して、SQLへの呼び出しを行うために、Hibernateのパラダイムの外側に歩いています。それは悪いことではありませんが、疎結合を維持しようとすれば抽象化を破るのを避けることができます。

ストレートHQLクエリを使用すると、クエリの結果を含むタプルのコレクションを返すことができます。私はここであなたが見てしたい場合があります

Custom query with Castle ActiveRecord

これを行う方法を説明しました。HQLBasedQueryを新規作成するときにタイプを指定する必要があるにもかかわらず、NHはタイプインスタンスを選択しないと、オブジェクトタプルに基づいて結果セットをアセンブルする必要があることを知ります。

(IMNSHOまだ純粋ではないですが、私はこの関係をオブジェクトとしてモデル化し、それに応じてマップしようと思いますが、オブジェクトモデルに合わせてDBを形にしなければならないでしょうすべての場合に飛ぶつもりはありません)。

2

これは長い時間前に尋ねられましたが、私はうまく答えています。

public static IList<T> ExecuteQuery<T>(HqlBasedQuery query) 
    where T : new() 
{ 
    query.SetResultTransformer(new NHibernate.Transform.AliasToBeanResultTransformer(typeof(T))); 
     var results = (ArrayList)ActiveRecordMediator.ExecuteQuery(query); 

    List<T> list = new List<T>(results.Count); 
    for (int i = 0; i < results.Count; i++) 
    { 
     list.Add((T)results[i]); 
    } 

    return list; 
} 

これは、型T型Tの結果が希望何もすることができますをお返しします。型Tには引数なしのコンストラクタが必要です。構築するクエリの列名またはエイリアスに一致するパブリックフィールドまたはプロパティが必要です。

私たちはこれを常にしています。特に、集計データを生成するためにHQLで集約関数を使用する場合。

コンパニオン機能を使用すると、単なる文字列だけでなく、あなたが持つかもしれない任意の位置パラメータとしてクエリに渡すことができるようになります:

public static IList<T> ExecuteQuery<T, U>(string hqlQuery, params object[] parameters) 
     where T : new() 
    { 
     return ExecuteQuery<T>(new HqlBasedQuery(typeof(U), hqlQuery, parameters)); 
    } 

タイプUは、有効なActiveRecordのタイプである任意の型です。参照しているタイプの1つである必要はありません。もしあなたがそれを置き換えることができれば、あなたが知っているいくつかのタイプは有効なセッションであり、余分なパラメータを削除するでしょう。

関連する問題