NHibernate 3 introduced the With clause Criteria API用。私はそれを使用して、多対多関係の結合を制限しようとしています.Hibernateは、正しいテーブルではなく、リンクテーブルに追加の結合制限を適用しています。Criteria API多対多関係のWith節
PlayerとAddressの間に多対多の関係があり、Playerとその郵送先住所をAddress.IsMailingAddressに制限して返信したいと考えています。 Restricting IsMailingAddress where句では、メールアドレスを持たないレコード(またはアドレスがまったくない)は返されません。そのため、結合でそれを制限する必要があります。以下のコードは簡略化されており、HQLを使用することはできません。
クエリ:
var target = session.CreateCriteria<Player>()
.SetProjection(Projections.Property("PlayerId"))
.CreateAlias("Addresses", "ad", JoinType.LeftOuterJoin, Restrictions.Eq("ad.IsMailingAddress", true))
.Add(Restrictions.Eq("LastName", "Anonymous"))
.List();
は、SQLを生成します。
SELECT this_.PlayerId as y0_
FROM dbo.VPlayerExisting this_
left outer join dbo.LinkPlayAddr addresses3_
on this_.PlayerId = addresses3_.PlayerId
and (ad1_.MailingAddressFlag = 1 /* @p0 */)
left outer join dbo.VAddress ad1_
on addresses3_.AddressId = ad1_.AddressId
and (ad1_.MailingAddressFlag = 'Anonymous' /* @p1 */)
WHERE this_.Name_Last = @p2
はMailingAddressFlag(IsMailingAddressにマッピングされています列が)そうでない多対多のリンクテーブルに制限されていますAddressテーブルへの結合でLastName制限が適用されます。クエリは発行されますが、もちろんデータベースサーバは例外を発生させます。
これはバグですか、サポートされていないのですか、間違っていますか?
これはバグだと思いますが、簡単な回避策が見つかりました。木の森を見ることができる最初の人に25ポイント。ヒント:プレーヤーは複数のアドレスにリンクすることができますが、それらのアドレスの1つだけが郵送先アドレスです。 –