NHibernate - 没有映射的连接

时间:2011-01-20 21:38:33

标签: nhibernate join criteria queryover

我知道类似的问题已经被问到herehere,它可能是重复的。

但这两个地方的问题都没有得到妥善解决,我不得不再问:(

问题是,当它们之间没有可用的映射时,您是否可以使用Criteria API来连接两个表。

E.g

class Order{ UserId , OrderId} 
 class User{UserId , UserName}

我需要生成一个像

这样的查询
select user.UserName , order.OrderId from Order order join User user on order.UserId = user.UserId

如果有人知道这一点,请提供帮助..请注意我需要使用Criteria或QueryOver技术来做这件事

由于 / BB

1 个答案:

答案 0 :(得分:5)

以下是关于如何做到这一点的想法,但它有点难看。

由于映射没有说明 Order User 之间存在关系,因此很难让NHibernate在这两个表之间生成连接。 你可以做的是做一个内部选择,所以你的SQL查询看起来像这样:

SELECT o.OrderId, o.WhateverOtherPropertyNameFromOrder
       (SELECT u.UserName, u.WhateverOtherPropertyNameFromUser
        FROM   User u
        WHERE  u.UserId = o.UserId)
FROM   Order o

这可以在QueryOver上完成:

Order order = null;
User user = null;

QueryOver<User> query = QueryOver.Of<User>(() => user)
    .Select(Projections.ProjectionList()
               .Add(Projections.Property<User>(x => x.UserName)))
               .Add(Projections.Property<User>(x => x.WhateverOtherPropertyNameFromUser)))
    .Where(Restrictions.EqProperty("user.Id", "order.UserId"));

var result = session.QueryOver<Order>(() => order)
    .Select(Projections.ProjectionList()
            .Add(Projections.Property<Order>(c => c.OrderId))
            .Add(Projections.Property<Order>(c => c.WhateverOtherPropertyNameFromOrder))
            .Add(Projections.SubQuery(query)))
    .List<object[]>();

我不知道这对你是否有用,但它可以解决你的问题。