0

我正在研究一个非常复杂的遗留数据库。
客户表与供应商共享,创建此结构的人使用标志来识别客户。由于我只对处理定义为客户的记录感兴趣,因此我在映射中添加了 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();

但是,如果我查询订单表 - 我有一个多对一的关联:

<?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 子句,但是,我如何使用多对一来做到这一点?

谢谢你的帮助。

4

3 回答 3

1

我认为 degorolls 是正确的:您需要有一个名为“Person”的超类,以及两个名为“Customer”和“Supplier”的子类型。然后设置映射,使其使用 ANFCLI 字段作为鉴别器,Y 值表示客户,N 值表示供应商。这样,您将拥有一个漂亮而透明的多态性。(您将能够执行“来自客户”或“来自供应商”之类的操作,这将自动添加 where 子句)。

希望有帮助!

于 2011-07-26T13:45:01.167 回答
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>
于 2011-07-25T23:34:03.223 回答
0

我也是使用 NHibernate 的新手,但也许您可以使用包(好像是一对多)映射该关系(订单到客户)!

于 2011-07-25T16:15:30.360 回答