Nhibernate 多对一和where子句

Nhibernate 多对一和where子句,nhibernate,where-clause,many-to-one,Nhibernate,Where Clause,Many To One,我正在处理一个非常复杂的遗留数据库。 表customers与供应商共享,创建此结构的供应商使用标志标识客户。 由于我只对定义为客户的记录感兴趣,因此在映射中添加了where子句: <?xml version="1.0" encoding="utf-8"?> <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="MyAssembly" namespace="MyAssembly.Domain">

我正在处理一个非常复杂的遗留数据库。
表customers与供应商共享,创建此结构的供应商使用标志标识客户。 由于我只对定义为客户的记录感兴趣,因此在映射中添加了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>
但如果我查询orders表,其中有多对一的关联:

<?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子句,但是,如何使用多对一呢


谢谢您的帮助。

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

如何使用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>

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


希望有帮助

谢谢你的帮助。我试过了,但似乎不起作用。所有生成的查询都不包括过滤器。实际上,我认为这是我的错。我试图查询订单,但它使用(复合)主键连接表customers,不需要过滤器。谢谢你的帮助!(拍了拍额头)我应该拿起它-当然,如果你使用主键,在任何一种情况下都不需要过滤器…谢谢你的帮助,谢谢。我读了一些关于鉴别器的东西,它似乎解决了我的问题,但它只在我询问时起作用。如果-在我的情况下-我想获取所有订单,则会包括客户,但ANFCLI='Y'不包括在我的查询中。
<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>