Nhibernate:在子查询上左外连接

sam*_*amy 4 nhibernate subquery left-join

更新需要2

这是我正在使用的两个查询(在两个查询中都省略了分页)

我想得到以下查询

SELECT * 
FROM product
LEFT OUTER JOIN 
(
    SELECT * 
    FROM Cart 
    LEFT OUTER JOIN 
    cartproducts 
    ON Cart.Id = cartproducts.Cart_id 
    WHERE Cart.username = 'user'
)
AS CartFiltered 
ON product.Id = CartFiltered.product_id
Run Code Online (Sandbox Code Playgroud)

但我似乎总是得到

SELECT * 
FROM product  
LEFT OUTER JOIN 
cartproducts 
ON product.Id = cartproducts.Product_id 
LEFT OUTER JOIN
Cart
ON
cartproducts.cart_id = cart.id
WHERE Cart.username = 'user'
Run Code Online (Sandbox Code Playgroud)

我如何设法创建第一种查询?我希望我的问题更清楚:)缺乏清晰度有时候是我的大敌:p


更新:

FWIW,我仍然没有找到答案,我正在加载分页产品数据和整个购物车以显示正确的对象.原始解决方案,但它的工作原理,它击败了我一直试图让Criteria API认识我作为它的主人的组合.如果有人碰巧指出我正确的方向,我会很感兴趣;)


你好,

我很难在Criteria API中编写以下查询,我真的没有看到如何做到这一点:我希望有些人可以提供帮助.

在数据库上,我有产品.这些产品可以在许多推车(每个用户一个推车),每个推车可以包含许多产品,所以我们有很多关系.我想显示每个产品的列表,旁边还有一个小图标,告知用户该特定产品已经在购物车中.我做的是我向NHibernate询问我的产品,并在购物车所有者过滤的推车上做左外连接.

Dim critPage As ICriteria = Session.CreateCriteria(GetType(Product)) _
.SetFirstResult(pageNumber * itemsPerPage).SetMaxResults(itemsPerPage) _
.CreateCriteria("Carts", "c", SqlCommand.JoinType.LeftOuterJoin) _
.SetProjection(plist) _ 
.SetResultTransformer(New TypedResultTransformer(Of ProductWithCartInfo)) _
.Add(Expression.Eq("c.User", username))
Run Code Online (Sandbox Code Playgroud)

投影列表用于将列数减少到ProductWithCartInfo类的有趣位置.它仅包含属性预测.

问题是,通过此查询,购物车过滤将应用于整个结果集,并且我看不到每个产品都存在于用户的购物车中,而是用户购物车中的每个产品.

是否可以使用Nhibernate中的Criteria API在子查询上执行左外连接?有关信息,我希望尽可能将其保留在Criteria API中.谢谢

Tod*_*odd 6

我不确定我是否会继续关注您的问题,但这听起来与我遇到的问题非常相似.我似乎当你有NHibernate的嵌套(子)criteira时你松了一些控件.我能够解决我的问题但是使用表格别名而不是使用嵌套的criteira.

可能会尝试......

criteria.CreateAlias("Cart", "Cart", JoinType.LeftOuterJoin);
Run Code Online (Sandbox Code Playgroud)

然后你的购物车上的过滤器必须是OR条件

ICriterion cartCriterion = Restrictions.Eq("Cart.User", username);
customerCriterion = Restrictions.Or(customerCriterion, Restrictions.IsNull("Cart.User"));
criteria.Add(customerCriterion);
Run Code Online (Sandbox Code Playgroud)

让我知道,如果这有助于你...如果不是......也许发布你上面的标准正在生成的SQL以及它需要改变的地方.

祝好运