更新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中。 感谢
答案 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以及需要更改的位置。
祝你好运