NHibernate HQL连接列

时间:2012-12-29 22:48:47

标签: c# nhibernate hql

我研究了nhibernate连接,无法弄清楚连接是如何执行的。在示例中,它不提供要执行连接的列。这些是根据映射自动执行的吗?

如果我有2个实体并且它们之间有2个独立的关系怎么办?这意味着加入2个实体有多种可能性?

1 个答案:

答案 0 :(得分:1)

答案是“这些是根据映射自动执行的”(如您所述)。

作为NHibernate映射一部分的任何C#对象(PO​​CO实体)都明确地连接到底层表和列。实体级别(C#)上的任何关系都与DB表关系类似。

文档14.3. Associations and joins中的

HQL 示例:

from Eg.Cat as cat 
  join cat.Mate as mate
  left join cat.Kittens as kitten

...已完成,并从映射中获利。这提供了足够的信息, Cat Mate 如何相关,如何加入它以获取 Kittens 的列表

来自文档5.1. Mapping declaration

映射

<?xml version="1.0"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Eg"
    namespace="Eg">

        <class name="Cat" table="CATS" discriminator-value="C">
                <id name="Id" column="uid" type="Int64">
                        <generator class="hilo"/>
                </id>
                <discriminator column="subclass" type="Char"/>
                <property name="BirthDate" type="Date"/>
                <property name="Color" not-null="true"/>
                <property name="Sex" not-null="true" update="false"/>
                <property name="Weight"/>
                <many-to-one name="Mate" column="mate_id"/>
                <set name="Kittens">
                        <key column="mother_id"/>
                        <one-to-many class="Cat"/>
                </set>
                <subclass name="DomesticCat" discriminator-value="D">
                        <property name="Name" type="String"/>
                </subclass>
        </class>

        <class name="Dog">
                <!-- mapping for Dog could go here -->
        </class>

</hibernate-mapping>

加入。因此,如果我们选择Mate,我们将使用表mate_id中的列CATS从其表中获取Mate。当我们需要具有相同类型(Cat)的子项时,我们将转到表CATS并搜索列mother_id等于当前{{}的所有记录1}}列值。

所以,“这些是基于映射自动执行的”