1

親のクラスのプロパティを使用して、コレクション (SET) にフィルターを適用したいと考えています。
コレクションに句を使用できることがわかりましたwhere-そしてそれはうまくいくようです-しかし、これが最良の選択肢であるかどうか、またはこの解決策が将来私に苦痛を与える可能性があるかどうかはわかりません。

ここに画像の説明を入力

これは私のクラスのマッピングですOrder:

<class name="Order" table="OCSAORH_NHBP" 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>
    <property name="WareHouseDelivery" column="OCHMAGS" type="String" length="7"></property>

    <set name="OrderLines" access="field.pascalcase-underscore" inverse="true" lazy="true" mutable="false" cascade="none" where="OCLMAGS = this_.OCHMAGS">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true"/> 
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found ="ignore" />
    </set>
</class>

これは私のクラスOrderLineです:

<class name="OrderLine" table="OCSALIN_NHBP" mutable="false" where="OCLAMND = 0">
    <composite-id>
      <key-property name="Number" column="OCLORDN" type="String" length="10"></key-property>
      <key-property name="Company" column="OCLCOSC" type="String" length="5"></key-property>
      <key-property name="Line" column="OCLLINN" type="Int32"></key-property>
      <key-property name="Seq" column="OCLSSEQ" type="Int32"></key-property>
    </composite-id>
    <property name="Item" column="OCLITMN" type="String" length="19"></property>
    <property name="WareHouseDelivery" column="OCLMAGS" type="String" length="7"></property>

    <many-to-one name="Order" class="Order">
      <column name="OCLORDN" not-null="true"/>
      <column name="OCLAMND" not-null="true"/>
      <column name="OCLCOSC" not-null="true"/>
    </many-to-one>
</class>

これは Oracle のレガシー データベースであり、そのスキーマを変更することはできません。主キーはすべて複合キーです。

ここで、いくつかの基準を使用して注文をフェッチし、フィールドOCHMAGS (プロパティ WareHouseDelivery) をフィルターとして使用して、注文明細行を遅延ロードします。
ご覧whereのとおり、親のテーブルのエイリアスを使用してセットに句を定義しました。

<set name="OrderLines" ... where="OCLMAGS = this_.OCHMAGS">

PS: orderlines コレクションをeager-loadします:

var qry = .QueryOver<Domain.Order>()
    .Fetch(t => t.OrderLines).Eager
    .JoinAlias(t => t.OrderLines, () => orderLine, JoinType.LeftOuterJoin);

これは実行可能な解決策ですか?他の選択肢はありますか?

4

1 に答える 1

1

私はあなたのコメントについて確信が持てません: ...そしてそれはうまくいくようです...
それはうまくいかないからです。thisを表す は、コレクション マッピングのParentWHERE 句では使用できません。コレクションテーブルのエイリアスです。

コレクションは所有者とは別に読み込まれます。NHibernate はテーブル「OCSALIN_NHBP」を実行しSELECT...FROMますOrderLine。親への JOIN なし。WHERE句のパラメータとして注入さParentIdれます(あなたの場合、キーはより多くの列から構成されています)。それでおしまい。

その方法の 1 つは、ParentTable を副選択として使用して、より複雑な WHERE 句を作成することです。(もちろん、これは大きなテーブルではあまり効果的ではありません)

  <set ...
    where="OCLMAGS IN 
      (SELECT p.OCLMAGS FROM OCSAORH_NHBP p WHERE p.OCLORDN = OCLORDN...)" >

他の方法もあるかもしれませんが、thisそうではないようです

于 2013-10-03T03:17:15.480 に答える