4

更新拍摄 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 中。谢谢

4

1 回答 1

6

我不确定我是否完全关注您的问题,但这听起来与我遇到的问题非常相似。我似乎当您拥有 NHibernate 的嵌套(子)标准时,您会失去一些控制权。我能够解决我的问题,但为我的表设置别名而不是使用嵌套的标准。

可能尝试...

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);

让我知道这是否有助于您...

祝你好运

于 2009-07-31T12:23:16.267 回答