我有以下课程
<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个有效的自定义字段。
我在测绘中遗漏了什么吗?
答案 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
?