NHibernate - 无需映射即可加入

标签 nhibernate join criteria queryover

我知道有人问过类似的问题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

最佳答案

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

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

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

关于NHibernate - 无需映射即可加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752919/

相关文章:

python - 如何解决 pywinauto 的 ElementAmbiguousError : There are 2 elements that match the criteria error

NHibernate:保留一个带有子对象的对象

c# - 在 Fluent NHibernate 中通过 ID 设置引用的实体

c# - Nhibernate - 与 Cascade all-delete-orphan 一对一映射,不删除孤儿

sql - 如何查找 SQLite 数据库中所有列的信息?

postgresql - 在 Postgres 中将三个表连接在一起的更有效方法

mysql - 使用连接来处理 MySQL 查询

java - hibernate 标准 : why no Subqueries. isNull(DetachedCriteria)?

java - 使用 list() hibernate 获取特定列

c# - 查询 HasMany 引用