【问题标题】:NHibernate - join without a mappingNHibernate - 加入没有映射
【发布时间】:2011-01-20 21:38:33
【问题描述】:

我知道herehere 有人问过类似的问题,而且可能是重复的。

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

问题是当两个表之间没有可用的映射时,您能否使用 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

【问题讨论】:

    标签: nhibernate join criteria queryover


    【解决方案1】:

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

    由于映射没有说明 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[]>();
    

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

    【讨论】:

    • 谢谢,但我决定改为添加映射。知道没有映射就不可能做到这一点确实很有帮助。 :)
    • 澄清一下,这只是 Criteria API 的限制。 HQL 和 LINQ 非常有能力进行临时连接。
    • @OskarBerggren 你能详细说明一下吗?任何详细说明替代方法的链接?
    • 我只是说,使用常规 LINQ,您可以加入任何内容(例如,从 x in Xs from y in Ys where x.Field == y.Field)。 NHibernate 映射不需要知道 X 和 Y 之间的任何特殊关系。
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2011-04-10
    相关资源
    最近更新 更多