【问题标题】:NHibernate QueryOver how to join on non declared relationshipNHibernate QueryOver如何加入未声明的关系
【发布时间】:2011-08-16 10:07:06
【问题描述】:

如何执行以下加入以返回有权访问给定公司 ID 的公司的用户。 问题是在 UserAccess 和 User 之间没有使用 User 对象的明确关系,他们只是在字符串属性 Username 上加入:

User(Username, Name)
UserAccess(Username, Company)
Company(Id)

Session.QueryOver<Company>()
        .Where(c => c.Id == companyId)
        .JoinQueryOver<UserCompanyAccess>(u => u.UserAccessList)
        .JoinQueryOver<User>(u => **Nope no property, just a string**

【问题讨论】:

标签: nhibernate join queryover


【解决方案1】:

可以通过子查询来完成

var subquery = QueryOver.Of<Company>()
    .Where(c => c.Id == companyId)
    .JoinQueryOver<UserCompanyAccess>(u => u.UserAccessList)
    .Select(uca => uca.UserName);

var users = session.QueryOver<User>()
    .WithSubquery.WhereProperty(u => u.Name).In(subquery)
    .List();

【讨论】:

    【解决方案2】:

    从 5.1.0 开始,可以让 hibernate 在未声明(未映射)的关系上生成实际的 sql 连接。例如。所有订单按客户支出排序:

    var criteria = _session
        .CreateCriteria<Order>("order");
    
    criteria
        .CreateEntityAlias(
            "customer",
            Restrictions.EqProperty("order.customerId", "customer._id"),
            JoinType.LeftOuterJoin,
            typeof(Customer).FullName)
        .AddOrder(new Order("customer._lifetimeSpending", ascending:false));
    
    return criteria.List<Order>();
    

    也可以使用 QueryOver(来自NHibernate docs 的示例):

    Cat cat = null;
    Cat joinedCat = null;
    
    var uniquelyNamedCats = sess.QueryOver<Cat>(() => cat)
        .JoinEntityAlias(
            () => joinedCat,
            () => cat.Name == joinedCat.Name && cat.Id != joinedCat.Id,
            JoinType.LeftOuterJoin)
        .Where(() => joinedCat.Id == null)
        .List();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多