2

我知道已经在这里这里提出了类似的问题,它可能是重复的。

但是这个问题在这两个地方都没有得到正确的回答,所以很不情愿,我不得不再问一遍:(

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

例如

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

4

1 回答 1

5

这是一个关于如何完成的想法,但它有点难看。

由于映射没有说明OrderUser之间存在关系,因此 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[]>();

我不知道这对您是否有用,但它是您问题的潜在解决方案。

于 2011-01-21T00:49:34.087 回答