2011-01-25 10 views
0

コンポーネントの "エイリアス"を作成する方法はありますか?
"Address.City"(または "User.Address.City"、...)の形式で文字列を受け取り、それに基づいてICriteria(フィルタと並べ替え)を作成する「Criteria Builder」があります。
「アドレス」クラスをマップするコンポーネントを使用しているため、「ユーザー」と同じテーブルにとどまります。NHibernateコンポーネントマッピング(作成基準)

私は取得しています例外がある:
NHibernate.QueryExceptioncouldは、プロパティを解決できません:市:MyNamespace.User

私は住所コンポーネントの「エイリアス」を作成していないしようとすると、それだけで正常に動作します。
しかし、それは基準ビルダーであるため、 "Address"がコンポーネントであり、呼び出し基準criteria.CreateAlias( "Address")を避ける方法がありますか?どんな仕事?

Thisは私と同じ質問ですが、ソリューションは私にとって実行可能ではありません(私は各クエリに対して手動で条件を作成しません)。

任意の助けもいただければ幸いです!

+0

コードを投稿することはできますか? – Vadim

+0

@ヤーズ - 私は実際に今のところ私のコードはありません。 "User"クラスがプロパティを介して "Address"クラスを参照するように単純でなければなりません。ユーザーのマッピングでは、コンポーネントとして「アドレス」があります。私の問題とよく似ているので、https://forum.hibernate.org/viewtopic.php?p=2335410&sid=37a2a95223e929ae6cccfc183af6af28を見てください。ありがとう! – Frederico

答えて

1

アドレスがマップされたエンティティではないため、アドレスのエイリアスを作成することはできません。 CreateAliasCreateCriteriaの唯一の違いは、前者が元の基準を返し、後者が新しい下位基準を返すことです。したがって、Criteriaを作成できる唯一のクラスは、マップされたクラスです。コンポーネントはマップされたクラスではないので、それらの周りに基準を作成することはできません。

私が持っている唯一の提案は、IComponentのような空のディスクリプタインターフェイスを実装するか、カスタムComponentAttributeでマークするかのいずれかのAddressクラスを持つことです。次に、CriteriaBuilderは、基準を作成しているクラスがこのメタデータを持っているかどうかをチェックし、無視します。

+0

私は反射を使って属性をチェックするのは高価すぎると思っています(私の出発点は文字列 "Address.City"です)。他に何かを念頭に置いていないかぎり?この場合、「空の記述子」はどのように役立ちますか?いくつかのコードを投稿できますか?私が必要としたのは、CreateAliasが十分にスマートで、クラスがコンポーネントかどうかを検出する方法、またはそれを教えてくれる方法でした。= /助けてくれてありがとう! – Frederico

+0

@Frederico、あなたのCriteraiBuilderがどのように動作するかあなたのコードを見ることなく完全にはわかりません。おそらく 'if(objToMap is IComponent)// CreateAlias'を呼び出さないようなチェックをするだけかもしれません – Vadim

関連する問題