Nhibernate:在子查询上左外连接

时间:2009-07-27 10:20:06

标签: 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

但我似乎总是得到

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'

如何设法创建第一种查询? 我希望我的问题更清楚:)缺乏清晰度有时候是我的大敌: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))

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

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

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

1 个答案:

答案 0 :(得分:6)

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

可能会尝试......

criteria.CreateAlias("Cart", "Cart", JoinType.LeftOuterJoin);

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

ICriterion cartCriterion = Restrictions.Eq("Cart.User", username);
customerCriterion = Restrictions.Or(customerCriterion, Restrictions.IsNull("Cart.User"));
criteria.Add(customerCriterion);

请告诉我这是否可以帮助您...如果不是......可能会发布您上面的标准正在生成的SQL以及需要更改的位置。

祝你好运