NHibernate-加法与AddJoin问题

NHibernate-加法与AddJoin问题,nhibernate,Nhibernate,我使用NHibernate和SQL查询来填充一些实体对象 我有一个Item对象,它引用了一个User对象(表示该项的所有者) 我的SQL查询是(实际上更复杂,这就是为什么我不能使用HQL的原因,但我从这里开始是为了确保AddJoin/AddEntity正常工作): 这是我的密码: var x = session.CreateSQLQuery(sql) .AddEntity("i", typeof(Item)) .AddJoin("u", "i.User") .List()

我使用NHibernate和SQL查询来填充一些实体对象

我有一个Item对象,它引用了一个User对象(表示该项的所有者)

我的SQL查询是(实际上更复杂,这就是为什么我不能使用HQL的原因,但我从这里开始是为了确保AddJoin/AddEntity正常工作):

这是我的密码:

var x = session.CreateSQLQuery(sql)
    .AddEntity("i", typeof(Item))
    .AddJoin("u", "i.User")
    .List();
当我运行这个时,我得到一个二维数组。数组中的每个项都包含一个项对象(初始化了用户属性)和用户对象本身


我错过了什么?我希望得到一个初始化了User属性的Item对象列表(这就是我解释文档的方式)。

如果省略AddJoin方法会发生什么?
仅仅指定加法还不够吗?

已经有一段时间了,但我认为您忽略了这一点:

.SetResultTransformer(new DistinctEntityRootTransformer())

如果您的映射正确,您可以使用连接获取在一次命中中获得这一切,如下所示:

var x = session.CreateQuery("from Item i join fetch i.User").List<Item>();
var x=session.CreateQuery(“从项目i加入获取i.User”).List();

我只是浪费了一个下午来弄明白这一点。SetResultTransformer(CriteriaUtil.Distinctrotenty)在最后添加的东西上运行

下面是我从查询中获取第一个实体所做的工作。不过有一个缺点是,我不得不将NHibernate.DistinctRootEntityResultTransformer.TransformTuple()修改为虚拟的。这对我们来说不是什么大不了的事,因为我们已经将NHibernate分支用于一些像这样的琐碎添加。如果您不想分支NH,可以很容易地滚动您自己的IResultTransformer,确保项目是唯一的

将此添加到您的查询:

query.SetResultTransformer(new FirstTupleDistinctResultTransformer());
这是新课程:

public class FirstTupleDistinctResultTransformer : DistinctRootEntityResultTransformer
{
    public override object TransformTuple(object[] tuple, string[] aliases)
    {
        return tuple[0];
    }
} 
试试这个

    using NHibernate.Transform;
    //..

    var x = session.CreateSQLQuery(sql)     
    .AddEntity("i", typeof(Item))     
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())

    .List(); 

它只返回item

谢谢David,但是实际的SQL比我包含的要复杂得多。我需要理解为什么基本SQL不能返回我期望的结果,因为我不能使用HQL作为最终解决方案。谢谢Ben。我添加了这个-.SetResultTransformer(new DistinctRootEntityResultTransformer())-但随后我得到了一个用户列表,而不是所需的项目列表。我认为根实体应该是Item,所以肯定有其他错误。当存在另一个addjoin时,这不起作用。您需要滚动您自己的DistinctRootEntityResultTransformer。见下文。
public class FirstTupleDistinctResultTransformer : DistinctRootEntityResultTransformer
{
    public override object TransformTuple(object[] tuple, string[] aliases)
    {
        return tuple[0];
    }
} 
    using NHibernate.Transform;
    //..

    var x = session.CreateSQLQuery(sql)     
    .AddEntity("i", typeof(Item))     
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())

    .List(); 
var x = session.CreateSQLQuery(sql)     
    .AddEntity("i", typeof(Item))     
    .AddJoin("u", "i.User") 
    .AddEntity("i", typeof(Item)).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);