NHibernate - AddEntity和AddJoin问题

时间:2009-07-15 15:17:01

标签: nhibernate

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

我有一个引用User对象的Item对象(表示Item的所有者)

class Item
{
public User User;
}

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

SELECT {i.*}, {u.*}
FROM Item i INNER JOIN User u ON (i.UserId = u.Id)
WHere i.Id = 5

这是我的代码:

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

当我运行它时,我得到一个二维数组。数组中的每个项都包含一个Item对象(初始化User属性)和User对象本身。

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

6 个答案:

答案 0 :(得分:5)

我只是浪费了一个下午来解决这个问题。 SetResultTransformer(CriteriaUtil.DistinctRootEntity)对最后添加的内容进行操作。

以下是我从查询中获取第一个实体的操作。但是,我不得不将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];
    }
} 

答案 1 :(得分:3)

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

它只返回项目

答案 2 :(得分:1)

已经有一段时间了,但我想你错过了这个:

.SetResultTransformer(new DistinctEntityRootTransformer())

答案 3 :(得分:1)

试试这个

    using NHibernate.Transform;
    //..

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

    .List(); 

答案 4 :(得分:0)

如果省略AddJoin方法会怎样? 仅指定AddEntity是不够的?

答案 5 :(得分:0)

如果您的映射是正确的,您可以使用连接提取来完成所有这一切,如下所示:

var x = session.CreateQuery("from Item i join fetch i.User").List<Item>();