1

私はNHibernate 2.0.1.4000現在のすべての .NET 3.5 SP1 プロジェクトで使用してきましたが、他のクエリ (Query API または Criteria API のいずれかを使用) で問題はありませんでしたが、いくつかの新しいビジネス ロジックによって、この特定のプロジェクトで新しいクエリが必要であることが示されました。特定の null プロパティ (DateTime 型) を持つレコードを単一のテーブルから取得する必要があるアプリケーションのデータベース。

このタイプのクエリに等しくない制限を使用することはできませんが、代わりに IsNull 制限を使用できることがわかっているため、この単純なクエリは「値を null にすることはできません!」を生成します。実行時の例外。私は詳細な DEBUG モードの log4net ログ ファイルを確認しましたが、まだ解決していません。また、テーブルのクラスで、チェックしているプロパティが null 許容プロパティ (DateTime?) であることを確認して、ここでは発生していない、レコードの更新などを強制することによって発生する可能性のある問題...

ここにクエリがありますが、複雑なことは何もありません.MaxResultsの追加制限を使用して/使用せずに問題を解決しようとしましたが、結果を収集する前に例外がスローされます:

ICriteria criteria = session.GetISession().CreateCriteria(typeof (Order)).Add(NHibernate.Criterion.Restrictions.IsNull("ShippedOn")).SetMaxResults(10);

IList<Order> entityList = criteria.List<Order>();

これを解決するのに役立つ可能性のあるより多くの情報へのアイデアやポインタはありますか? 代わりに HQL を使用してみましたが、同じ問題があります...特定の null プロパティを持つレコードを返すことに関して、ここで何か不足していますか?

4

3 に答える 3

0

ドメインモデル、マッピング、データベースの間に不一致がある場合、この種の例外を以前に見ました。たとえば、データベースにnull許容のDateTimeフィールドがあり、モデルにnull許容のプロパティがない場合です。

しばらく前にブログの投稿で説明しました。これがあなたの問題であるかどうかはわかりませんが、確かによく知られているようです。

于 2008-12-23T12:47:46.290 に答える
0

.net では、DateTimes は null 可能ではありません。DateTime を使用するようにドメイン モデルを変更してみましたか? どれがヌル可能ですか?

基準クエリを使用して同様の例外を取得できます。Name という文字列プロパティを持つ Person ドメイン オブジェクトがあるとします。次の基準を作成できます。

ICriteria criteria = session.CreateCriteria(typeof(Person)
.Add(Restrictions.Eq(1234))

ただし、この基準をリストすると、int に対して文字列をテストしているため、NHibernate は型の不一致の例外をスローします。バックグラウンドで NHIbernate は、マップされたオブジェクトに対して巧妙な反射型チェックを行い、型が一致しない場合は例外をスローします。(これほど賢くなければ、おそらく SqlException が発生するでしょう)

于 2009-01-02T23:12:28.523 に答える
0

クイック更新...しかし、さらに調査したところ、トランザクションと作業単位が完了し、セッション .Flush() メソッドが呼び出されたときに期待が実際にスローされ、NHibernate が試行する方法に何らかの形で関連していることが判明しましたnull 許容テーブル フィールド/DAO プロパティを処理します。クラスで処理し、該当するテーブルのマッピングを行ったにもかかわらず、制限付きの基準が生成している実際の SQL により、SqlDateTime の問題によって Flush で例外がスローされます...

今のところ、私の回避策は、最初の制限からレコードを取得し、クエリではなくコードで IsNull チェックを処理することでした。パフォーマンスはそれほど高くありませんが、理解するまでは機能しています...

于 2008-11-18T22:32:24.850 に答える