字典的SQL别名返回重复的结果

时间:2011-05-04 10:08:56

标签: nhibernate nhibernate-mapping

我有以下课程

<class name="Product" table="Product">
<id name="ID" />
...
<map name="CustomFields" table="CustomFieldView">
     <key column="RECORDID" />
     <map-key column="CFName" type="String" />
     <element column="CFValue" type="String" />
</map>
</class>

和SP用CustomFields字典选择产品

 <sql-query name="GetProducts">
        <return alias="p" class="Product" />
        <return-join alias="cf" property="p.CustomFields" />

        SELECT {p.*}, {cf.*}

        FROM Product p
            INNER JOIN CustomFieldView cf ON p.ID = cf.RECORDID

        // WHERE
    </sql-query>

当我选择 WHERE ID = 1234 这样的单个产品时,它会按预期工作 - 返回一个带有填充的CustomFields Dictionary属性的Product。 但是当我选择不像 WHERE ID IN(18780,21642)或其他标准这样的单个产品时,我会将产品复制到'CustomFields.Count'次,例如2个产品,每个产品有20个自定义字段,然后是40个产品,每个产品有20个有效的自定义字段。

我在测绘中遗漏了什么吗?

1 个答案:

答案 0 :(得分:0)

您将返回Cartesian product,因此每个自定义字段都会返回您的产品x次。

要解决此问题,您需要使用以下内容: -

var query = Session
    .GetNamedQuery("GetProducts")
    .SetResultTransformer(new DistinctRootEntityResultTransformer());
    return query.List<Product>();

请注意,您将通过网络发送所有数据,NHibernate将执行不同的变压器客户端(意味着Web服务器或桌面应用程序)。

我不是100%确定是否会填充返回连接,因为我从未用这种方式做过,你需要测试一下。

修改 我认为你采取策略是不对的。你真的需要&lt; sql-query ...&gt;你可以使用其他策略吗HQL