如何在NHibernate映射中使用SELECT?

时间:2014-08-07 12:33:34

标签: c# sql nhibernate nhibernate-mapping

现在我的映射中有第二个代码:

  <class name="Order" table="tOrder">
    <id name="Id">
      <column name="Ref" sql-type="int"/>
      <generator class="native"/>
    </id>
    <property name="OrderNo" column="OrderNo"/>
    <property name="CustomerId" column="CustomerId"/>
    <join table="tOffer">
      <key column="Ref" unique="true"/>
      <component name="User" class="User" >
        <property name="Id" column="OfferId"/>
        <property name="UserName" column="UserName"/>
      </component>
      <component name="Driver" class="Contact">
        <property name="FirstName" column="FirstName"/>
        <property name="LastName" column="LastName"/>
        <property name="Email" column="DriverEMail"/>
        <property name="Fax" column="DriverFax"/>
        <property name="Phone" column="DriverTelephone"/>
      </component>
    </join>

看起来很好(而且它的工作没有问题),有问题。

Driver类的某些字段不正确(FirstName,LastName)。 他们应该从不同的数据库中获取这些字段的数据。从理论上讲,它看起来应该是这样的:

<join table="tDriver">
      <key column="Ref" unique="true"/>
      <component name="Driver" class="Contact">
        <property name="FirstName" column="Firstname"/>
        <property name="LastName" column="Lastname"/>
      </component>
</join>

但是我无法做到这一点,因为已经在映射中声明了Driver。使用View帮助可以轻松解决此问题,但还有另一个问题,我不应该对数据库进行任何更改(无法创建View)。 据我了解,有可能使用:

<sql-query name="...">...</sql-query>

在里面应该选择来自tOffer的Driver和来自tDriver的另外两个字段的数据。 所以,我的问题是,它应该如何正确看待它会起作用吗?我的意思是,我们是否会遇到其他映射属性的任何问题?

修改

内部应该是我想的,但是如何使用它......

  Select d.Firstname, d.Lastname, o.DriverEMail, o.DriverFax , o.DriverTelephone
  FROM tOffer as o WITH (nolock)
  INNER JOIN tDriver as d WITH (nolock) on d.Ref = o.Ref

P.S对我的英语很抱歉。

1 个答案:

答案 0 :(得分:1)

NHibernate支持类似视图的映射。我们可以使用另一种方法 table="tableName"

,而不是使用属性<subselect> (定位到表格或视图)

然后映射可能如下所示:

<join table=""> <!-- table="" attribute should be there, even empty-->
  <subselect>
      Select d.Firstname    AS FirstName
       , d.Lastname         AS LastName
       , o.DriverEMail      AS Email
       , o.DriverFax        AS Fax
       , o.DriverTelephone  AS Phone
       , d.Ref              AS Ref
      FROM tOffer as o WITH (nolock)
      INNER JOIN tDriver as d WITH (nolock) on d.Ref = o.Ref
  </subselect>
  <key column="Ref" unique="true"/>
  <component name="Driver" class="Contact">
    <!-- NOTE if the name and column do fit... the column def is redundant.. -->
    <property name="FirstName" column="FirstName"/>
    <property name="LastName"  column="LastName"/>
    <property name="Email"     column="Email"/>
    <property name="Fax"       column="Fax"/>
    <property name="Phone"     column="Phone"/>
  </component>
  ...
</join>

忘记同时返回 REF 列,这将是如何加入两个实体的方式