Nhibernate 返回行李属性时HQL查询中的重复行

Nhibernate 返回行李属性时HQL查询中的重复行,nhibernate,hql,Nhibernate,Hql,在我的查询中,我使用多个表,其中一些表不能设置为正常的nhibernate关系,因此我被迫返回由单个列组成的行,而不是实体的实例。我想返回的属性之一是行李/列表,我的查询如下: 选择p.ID、p.SomeOtherField、elements(p.MappedBagField)、o.AnotherField。。。来自父级p,其他类别o,… 该查询可以工作,但我遇到的问题是,当包包含多个链接记录时,我会返回多行。有什么简单的方法可以阻止这种情况发生吗?我尝试了不同的p.ID,但没有任何区别 [Ed

在我的查询中,我使用多个表,其中一些表不能设置为正常的nhibernate关系,因此我被迫返回由单个列组成的行,而不是实体的实例。我想返回的属性之一是行李/列表,我的查询如下:

选择p.ID、p.SomeOtherField、elements(p.MappedBagField)、o.AnotherField。。。来自父级p,其他类别o,…

该查询可以工作,但我遇到的问题是,当包包含多个链接记录时,我会返回多行。有什么简单的方法可以阻止这种情况发生吗?我尝试了不同的p.ID,但没有任何区别


[Edit]Criteria API是否更适合此情况?[/Edit]

看起来您只是试图获取一个包含已加载集合的父级列表,以及来自其他实体的一些数据,是否正确

在这种情况下:

var parents = session.CreateQuery(@"
    select p, o
    from Parent p, OtherClass o
    join fetch p.MappedBagField
    ...")
    .SetResultTransformer(Transformers.DistinctRootEntity)
    .List<object[]>();
var parents=session.CreateQuery(@)
选择p,o
来自父级p,其他类o
加入fetch p.MappedBagField
...")
.SetResult变压器(变压器距离)
.List();

结果的每个项目都有两个元素,[0]是父类,[1]是另一个类。

这就是包的语义。包允许复制实体。
不要使用袋子(列表),试着使用一套(
ISet
)。NHibernate通常应过滤掉重复项。

而不是使用不同的p.ID不同的p(不带.ID字段)

我对重复的结果行也有同样的问题。这解决了我的问题:

session.CreateQuery(
  "SELECT DISTINCT p, o
   FROM ParentClass AS p,
        OtherClass AS o
   INNER JOIN p.mappedBagField as bagField
   WHERE ...
   AND bagField.id IN (:interestingIds)")
.setParameterList("interestingIds", {1,2,3,4});
.list();
说明:

ParentClass和OtherClass是两个独立的类,没有(hibernate映射)关系

ParentClass.mappedBagField是第三个hibernate映射类的集合

在上面的示例中,我正在查找兴趣ID为1、2、3和4的行

如果ParentClass数据集有两个ID为2和4的mappedBagField条目,则(原始)选择将与上述InterestingID匹配两次

这将产生两行


将DISTINCT p添加到SELECT中会忽略重复的结果:每一行只出现一次(即使有多个有趣的ID点击)。

当您删除
元素时会发生什么?如果删除元素部分,则会出现异常,称为“集合附近的非法语法”然后是查询文本。您希望结果是什么样的?您好,我希望每个父记录有一行,包括关联子记录的列表(即MappedBagField属性)。目前,我正在结果中获取列表,但如果列表包含多条记录,则会得到重复的行。不幸的是,正如我在原始问题中所说,我还需要使用手动联接从其他一些表中检索列。@James:编辑以添加其他类。