2011-06-27 5 views
1

CastleのActiveRecordの新しいバージョンに追加されたSqlNamedQuery属性に問題があります。私が受け取る実行後Castle ActiveRecord: 'System.Int32'は 'System.Boolean'に変換できません。

IQuery query = Session.GetNamedQuery(Queries.GetItemName); 
query.SetParameter("id", 1212, NHibernateUtil.Int64); 
query.SetResultTransformer(Transformers.AliasToBean<Mapping>()); 

... 
[Property(Access = PropertyAccess.AutomaticProperty, NotNull = true)] 
public virtual bool IsPrimaryName { get; set; } 
... 

NHibernateのクエリ:私は、その結果マッピングでプロパティを宣言している

[assembly: SqlNamedQuery(Queries.GetItemName, "EXEC [dbo].[GetItemName] :id")] 
それとは別に

:私はこのようにそれを指定しています以下の例外:

Object of type 'System.Int32' cannot be converted to type 'System.Boolean'. 

以下のweb.configエントリも追加しましたが、成功しませんでした(たぶんhqlクエリにのみ適用されます)。

<add key="query.substitutions" value="true 1, false 0, yes 'Y', no 'N'" /> 

私の質問は - この問題を解決するにはどうすればよいですか?ストアドプロシージャは0または1を返しますが、私も '1'、 'true'、 'TRUE'などで試しました。どうすればこの問題を回避できますか?または、私はSqlNamedQueriesを削除する必要がありますか?

UPDATE:スタックトレース

[ArgumentException: Object of type 'System.Int32' cannot be converted to type 'System.Boolean'.] 
System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo culture, Boolean needsSpecialCast) +4070954 
System.RuntimeType.CheckValue(Object value, Binder binder, CultureInfo culture, BindingFlags invokeAttr) +9631414 
System.Reflection.MethodBase.CheckArguments(Object[] parameters, Binder binder, BindingFlags invokeAttr, CultureInfo culture, Signature sig) +151 
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture, Boolean skipVisibilityChecks) +223 
System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture) +28 
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, BindingFlags invokeAttr, Binder binder, Object[] index, CultureInfo culture) +101 
System.Reflection.RuntimePropertyInfo.SetValue(Object obj, Object value, Object[] index) +25 
NHibernate.Properties.BasicSetter.Set(Object target, Object value) +68 

がUPDATE:Selectステートメント:

SELECT 
     itm.ItemId AS ItemId, 
     itm.Value AS Value, 
     itm.Id AS ParentId, 
     1 AS IsPrimaryName 
FROM  
     [dbo].[Item] AS itm 
... 

私は私の上に言及したように含むSP側で、いくつかの異なるシナリオ、試してみました: '1' を、 'true'、 'TRUE' + BIT変数を宣言してselectステートメントから直接返しますが、すべて同様の例外で失敗します。

Thx!

+0

どちらの方言とどのバージョンのNHibernateを使用していますか? – jishi

答えて

4

クエリ置換は、HQLリテラルをSQLにマップするために使用されるので、ここでは役立たないでしょう。

あなたのスタックトレースが不完全である(あなたは内部例外を食べた)ので、私は確認することはできませんが、私はエラーがGetItemNameはあなたがboolプロパティにそれをマップしようとしているint列を返すということだと思いたいです。

あなたはSPから関連するSELECTを投稿することができますし、あなたのDTOクラスがMapping(それは右、DTOはなくマップされたエンティティ IS?)


更新:あなたのSELECTステートメントは、キャストを必要とします

SELECT ... 
     CAST(1 as bit) IsPrimaryName 
FROM ... 
+0

私は元の投稿を更新し、関連するselect文を含んでいます。この特定のケースでは、それはマッピングされたエンティティであり、Dtoではありません - 私はそれが悪いと分かり、最終的には間違いなくDtoになるでしょう。 – MonkeyCoder

+0

@MonkeyCoder:更新を参照してください。私はその理由について正しかった。 –

+0

ディエゴありがとう、それはキャストと正常に動作しています。 select文の外でビット変数を宣言し、それを本体に返すのがなぜ機能しないのか分かりますか?それ以降は、SQL Server側で何かがうまくいかないという考えを放棄したためです。この問題のおかげで、ありがとう。 – MonkeyCoder

0

名前付きクエリは、ストアドプロシージャが特別なクエリよりも追加の利点をもたらすと確信している限り、問題ありません。 Query.substitutionパラメータは、SQLクエリのデータを変換しています。コールスタックを表示してください。

0

SQL Serverはブール型IIRCをサポートしています。代わりに、ストアドプロシージャ "GetItemName"をブール値を返すように書き直すのはなぜですか?

そうでなければ、True/Falseの代わりに1/0をサポートするようにDialectを変更する必要があると思います。

+0

select文の戻り列の1つが 'int'ではなく 'bit'であることを明示的に宣言できる例を提供できますか?私はselect文の外で変数を宣言しようとしましたが、後でそれを本体に返しますが、それは私に同じ結果をもたらしました。 – MonkeyCoder

関連する問題