多対一および where 句
-
26-10-2019 - |
質問
私は非常に複雑なレガシーデータベースに取り組んでいます。
テーブル顧客はサプライヤーと共有され、この構造の作成者は顧客を識別するためにフラグを使用しました。私は顧客として定義されたレコードを操作することだけに興味があるので、マッピングに where 句を追加しました。
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
<class name="Customer" table="ANSADID" mutable="false" where="ANFCLI = 'Y'">
<composite-id>
<key-property name="CustomerCode" column="ANCOCO" type="String" length="10"></key-property>
<key-property name="Company" column="ANCOSO" type ="String" length="5"></key-property>
</composite-id>
<property name="Name" column="ANINCO" type="String" length="100"></property>
</class>
</hibernate-mapping>
ご覧のとおり、すべての顧客を次の句で事前にフィルタリングしました。 ANFCLI = 'Y'
顧客にクエリを実行すると、すべてが完全に正常に機能します (where 句が使用されます)。
var customers = session.QueryOver<Domain.Customer>()
.Where(t => t.Company == "ABC01")
.List();
しかし、多対 1 の関連付けがある order テーブルをクエリすると、次のようになります。
<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">
<class name="Order" table="OCSAORH" mutable="false" where="OCHAMND = 0">
<composite-id>
<key-property name="Number" column="OCHORDN" type="String" length="10"></key-property>
<key-property name="Ver" column="OCHAMND" type="Int32"></key-property>
<key-property name="Company" column="OCHCOSC" type="String" length="5"></key-property>
</composite-id>
<many-to-one name="Customer" class="Customer" lazy="proxy" fetch="join">
<column name="OCHCLII" not-null="true"/>
<column name="OCHCOSC" not-null="true"/>
</many-to-one>
</class>
</hibernate-mapping>
エンティティ顧客のフィルターが失われます。
where 句は関連付けでは機能せず、コレクション (バッグ、セットなど) では where 句を使用する必要があるとどこかで読んだのですが、多対 1 ではどうすればよいでしょうか?
助けてくれてありがとう。
解決
ANFCLIを使用して識別器を使用して顧客をマッピングし、差別因子値を「Y」に設定するのはどうですか。 Nhibernateは、これをWhere句よりも少し厳しく扱うと思います。
<class name="Customer" table="ANSADID" mutable="false" discriminator-value="Y">
<composite-id>
<key-property name="CustomerCode" column="ANCOCO" type="String" length="10" />
<key-property name="Company" column="ANCOSO" type ="String" length="5" />
</composite-id>
<discriminator column="ANFCLI" />
<property name="Name" column="ANINCO" type="String" length="100" />
</class>
他のヒント
Degorollsは正しいと思います。「Person」と呼ばれるスーパークラスと、「顧客」と「サプライヤー」と呼ばれる2つのサブタイプが必要です。次に、マッピングを設定して、ANFCLIフィールドを識別器として使用し、顧客のy値とサプライヤーのn値を使用します。このようにして、あなたは素晴らしくて透明な多型になります。 (「顧客から」や「サプライヤーから」などのことをすることができます。
それが役立つことを願っています!
私も NHibernate を使用する初心者ですが、バッグを使用して (1 対多であるかのように) その関係 (注文から顧客) をマッピングできるかもしれません。