多对一和where子句

时间:2011-07-25 15:41:26

标签: nhibernate where-clause many-to-one

我正在研究一个非常复杂的遗留数据库 表客户与供应商共享,创建此结构的人使用标志来标识客户。 由于我只对使用定义为客户的记录感兴趣,因此我在映射中添加了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子句(包,集等等),但是,我怎么能用多对一来做呢? / p>

谢谢你的帮助。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:1)

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

希望有所帮助!

答案 2 :(得分:0)

我也是使用NHibernate的新手,但也许你可以使用一个包来映射这种关系(Order to Customer)(好像它会是一对多的)!