我知道有人问过类似的问题here和 here它可能是重复的。
但是这个问题在两个地方都没有得到正确的回答,所以很不情愿,我不得不再问一次:(
问题是,当两个表之间没有可用的映射时,您是否可以使用 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
最佳答案
这里有一个关于如何完成它的想法,但它有点难看。
由于映射没有声明 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[]>();
我不知道这对您是否有用,但它是解决您问题的潜在解决方案。
关于NHibernate - 无需映射即可加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752919/