2012-03-02 7 views
9

データベース管理にNHibernateを使用しています。NHibernateエイリアシングのバグ

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = Id GROUP BY r.Meter_Id) AS x) 

生成されたクエリは次のようになります:

(SELECT MIN(x.timestamp) FROM (SELECT MAX(r.Timestamp) AS timestamp, r.Meter_Id FROM Reading r, Meter m WHERE r.Meter_Id = m.Id AND m.Store_Id = this_.Id GROUP BY r.Meter_Id) AS this_.x) 

明らかにAS文で名前が引き起こす、this_.xという名前に変更されて、私は次の式を使用してプロパティを計算しています一つのクラスで エラー。

既知のバグのようです:NHibernate JIRA #NH-2878

はenyoneは、このためのソリューションを持っていますか?

答えて

1

私は間違っているかもしれませんが、実際にその特定の数式でエイリアスが必要な理由は実際にはわかりません。問題の周り

  • 作業:より一般的な意味で

    は、あなたはいくつかのオプションがあります。
    ストアドプロシージャを使用するか、より多くのデータをロードして計算をメモリ内で実行できます。
  • 修正します。 NHibernateはオープンソースです - コードをプルダウンし、原因を見つけ出し、テストで分離し、修正し、プルリクエストを送信します。
  • 他の人に修正を依頼してください。あなたの会社がNHibernateを使用していて、これが彼らにとって重要なのであれば、彼らはたぶん別のNHibernateコントリビュータを後援して修正プログラムを実装できます。
+0

エイリアスが使用されていないと、SQLエラーが発生するため、エイリアスが必要です。誰かがすでにこれを修正しているかどうか知りたいです。何もない場合は、私の問題にデータベースビューを使用すると思います。 – Coxer

0

私は、バグを修正する方法を知らないだろうが、次のように、あなたの計算を書いてみてください:

SELECT TOP 1 MAX(r.Timestamp) AS timestamp 
FROM Reading r, Meter m 
WHERE r.Meter_Id = m.Id AND m.Store_Id = Id 
GROUP BY r.Meter_Id 
order by Max(r.timestamp) asc 
1

流暢NHibernateの地図の中からデータベース関数を呼び出すとき、私はこれと同じ問題がありました。フォーミュラ()メソッド。私の回避策は、ailasを使用する代わりに完全な関数名を繰り返すことでした。

たとえば、EntityColumn2は、エンティティに既に参照されている列です。

SELECT My_Db_Function.Column1 
FROM My_Db_Function(arg1, arg2, arg3, ...) 
WHERE My_Db_Function.Column2 = EntityColumn2 

結果はMy_Db_Function参照があるとして滞在(とNHibernateのでエイリアスされていない)ということで、EntityColumn2が正しくNHibernateのでエイリアスされています。

+0

これはNHibernateのバグとして報告されています:https://nhibernate.jira.com/browse/NH-2878 –

+0

接頭辞の名前は型に対しても機能します。私のケースでは、NHibernateは 'datetime'の前にテーブルエイリアスを接頭していましたが、' sys.datetime'に変更した後で動作しました。 http://ayende.com/blog/1720/using-sql-functions-in-nhibernateにも記載されています: "NHibernateは、現在のエンティティテーブルのエイリアスを自動的に未修飾カラムアクセスのようなものにプリペンドします" – Chaquotay

関連する問題